Create trunk, branches and tags directories.

Move graphics, ecu_defs and src under trunk.


git-svn-id: http://svn.3splooges.com/romraider-arch/trunk@6 d2e2e1cd-ba16-0410-be16-b7c4453c7c2d
This commit is contained in:
drees 2006-06-23 06:53:08 +00:00
commit 78d990032e
43 changed files with 7935 additions and 0 deletions

View File

@ -0,0 +1,280 @@
package enginuity;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.tree.DefaultMutableTreeNode;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import com.sun.org.apache.xerces.internal.parsers.DOMParser;
import enginuity.maps.Rom;
import enginuity.maps.Table;
import enginuity.net.URL;
import enginuity.swing.ECUEditorMenuBar;
import enginuity.swing.ECUEditorToolBar;
import enginuity.swing.JProgressPane;
import enginuity.swing.MDIDesktopPane;
import enginuity.swing.RomTree;
import enginuity.swing.RomTreeNode;
import enginuity.swing.TableFrame;
import enginuity.xml.DOMSettingsBuilder;
import enginuity.xml.DOMSettingsUnmarshaller;
public class ECUEditor extends JFrame implements WindowListener {
private DefaultMutableTreeNode imageRoot = new DefaultMutableTreeNode("Open Images");
private RomTree imageList = new RomTree(imageRoot);
private Vector<Rom> images = new Vector<Rom>();
private Settings settings = new Settings();
private String version = new String("0.2.7.4 Beta");
private String versionDate = new String("5/09/2006");
private String titleText = new String("Enginuity v" + version);
private MDIDesktopPane rightPanel = new MDIDesktopPane();
private Rom lastSelectedRom = null;
private JSplitPane splitPane = new JSplitPane();
private ECUEditorToolBar toolBar;
private ECUEditorMenuBar menuBar;
public ECUEditor() {
// get settings from xml
try {
InputSource src = new InputSource(new FileInputStream(new File("./settings.xml")));
DOMSettingsUnmarshaller domUms = new DOMSettingsUnmarshaller();
DOMParser parser = new DOMParser();
parser.parse(src);
Document doc = parser.getDocument();
settings = domUms.unmarshallSettings(doc.getDocumentElement());
} catch (Exception ex) {
JOptionPane.showMessageDialog(this, "Settings file not found.\n" +
"A new file will be created.", "Error Loading Settings", JOptionPane.INFORMATION_MESSAGE);
}
setSize(getSettings().getWindowSize());
setLocation(getSettings().getWindowLocation());
if (getSettings().isWindowMaximized() == true) setExtendedState(JFrame.MAXIMIZED_BOTH);
JScrollPane rightScrollPane = new JScrollPane(rightPanel,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
JScrollPane leftScrollPane = new JScrollPane(imageList,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftScrollPane, rightScrollPane);
splitPane.setDividerSize(4);
splitPane.setDividerLocation(getSettings().getSplitPaneLocation());
this.getContentPane().add(splitPane);
rightPanel.setBackground(Color.BLACK);
imageList.setScrollsOnExpand(true);
imageList.setContainer(this);
//create menubar and toolbar
menuBar = new ECUEditorMenuBar(this);
this.setJMenuBar(menuBar);
toolBar = new ECUEditorToolBar(this);
this.add(toolBar, BorderLayout.NORTH);
//set remaining window properties
setIconImage(new ImageIcon("./graphics/enginuity-ico.gif").getImage());
setDefaultCloseOperation(EXIT_ON_CLOSE);
addWindowListener(this);
setTitle(titleText);
setVisible(true);
}
public void windowClosing(WindowEvent e) {
getSettings().setSplitPaneLocation(splitPane.getDividerLocation());
if (getExtendedState() == JFrame.MAXIMIZED_BOTH) getSettings().setWindowMaximized(true);
else {
getSettings().setWindowMaximized(false);
getSettings().setWindowSize(getSize());
getSettings().setWindowLocation(getLocation());
}
DOMSettingsBuilder builder = new DOMSettingsBuilder();
try {
JProgressPane progress = new JProgressPane(this, "Saving settings...", "Saving settings...");
builder.buildSettings(settings, new File("./settings.xml"), progress);
} catch (IOException ex) { }
}
public void windowOpened(WindowEvent e) { }
public void windowClosed(WindowEvent e) { }
public void windowIconified(WindowEvent e) { }
public void windowDeiconified(WindowEvent e) { }
public void windowActivated(WindowEvent e) { }
public void windowDeactivated(WindowEvent e) { }
public static void main(String args[]) {
new ECUEditor();
}
public String getVersion() {
return version;
}
public Settings getSettings() {
return settings;
}
public void addRom(Rom input) {
// add to image vector
images.add(input);
// add to ecu image list pane
RomTreeNode romNode = new RomTreeNode(input);
imageRoot.add(romNode);
imageList.updateUI();
// add tables
Vector<Table> tables = input.getTables();
for (int i = 0; i < tables.size(); i++) {
romNode.add(tables.get(i));
}
imageList.expandRow(imageList.getRowCount() - 1);
imageList.updateUI();
this.setLastSelectedRom(input);
if (input.getRomID().isObsolete() && settings.isObsoleteWarning()) {
JPanel infoPanel = new JPanel();
infoPanel.setLayout(new GridLayout(3, 1));
infoPanel.add(new JLabel("A newer version of this ECU revision exists. " +
"Please visit the following link to download the latest revision:"));
infoPanel.add(new URL(getSettings().getRomRevisionURL()));
JCheckBox check = new JCheckBox("Always display this message", true);
check.setHorizontalAlignment(JCheckBox.RIGHT);
check.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
settings.setObsoleteWarning(((JCheckBox)e.getSource()).isSelected());
}
}
);
infoPanel.add(check);
JOptionPane.showMessageDialog(this, infoPanel, "ECU Revision is Obsolete", JOptionPane.INFORMATION_MESSAGE);
}
input.setContainer(this);
}
public void displayTable(TableFrame frame) {
frame.setVisible(true);
try {
rightPanel.add(frame);
} catch (IllegalArgumentException ex) {
// table is already open, so set focus
frame.requestFocus();
}
frame.setSize(frame.getTable().getFrameSize());
rightPanel.repaint();
}
public void removeDisplayTable(TableFrame frame) {
rightPanel.remove(frame);
rightPanel.repaint();
}
public void closeImage() {
for (int i = 0; i < imageRoot.getChildCount(); i++) {
RomTreeNode romTreeNode = (RomTreeNode)imageRoot.getChildAt(i);
Rom rom = romTreeNode.getRom();
if (rom == lastSelectedRom) {
Vector<Table> romTables = rom.getTables();
for (Iterator j = romTables.iterator(); j.hasNext();) {
Table t = (Table)j.next();
rightPanel.remove(t.getFrame());
}
rom.closeImage();
romTreeNode.setRom(null);
romTreeNode.removeAllChildren();
images.remove(i);
imageRoot.remove(romTreeNode);
break;
}
}
imageList.updateUI();
try {
setLastSelectedRom(((RomTreeNode)imageRoot.getChildAt(0)).getRom());
} catch (Exception ex) {
// no other images open
setLastSelectedRom(null);
}
rightPanel.repaint();
}
public void closeAllImages() {
while (imageRoot.getChildCount() > 0) {
((Rom)images.get(0)).closeImage();
images.remove(0);
imageRoot.remove(0);
}
imageList.updateUI();
setLastSelectedRom(null);
rightPanel.removeAll();
rightPanel.repaint();
}
public Rom getLastSelectedRom() {
return lastSelectedRom;
}
public void setLastSelectedRom(Rom lastSelectedRom) {
this.lastSelectedRom = lastSelectedRom;
if (lastSelectedRom == null) {
this.setTitle(titleText);
} else {
this.setTitle(titleText + " - " + lastSelectedRom.getFileName());
}
// update filenames
for (int i = 0; i < imageRoot.getChildCount(); i++) {
((RomTreeNode)imageRoot.getChildAt(i)).updateFileName();
}
toolBar.updateButtons();
menuBar.updateMenu();
imageList.updateUI();
}
public ECUEditorToolBar getToolBar() {
return toolBar;
}
public void setToolBar(ECUEditorToolBar toolBar) {
this.toolBar = toolBar;
}
public void setSettings(Settings settings) {
this.settings = settings;
for (int i = 0; i < images.size(); i++) {
images.get(i).setContainer(this);
}
}
public void repaintPanel() {
rightPanel.repaint();
rightPanel.update(rightPanel.getGraphics());
}
public Vector<Rom> getImages() {
return images;
}
}

206
src/enginuity/Settings.java Normal file
View File

@ -0,0 +1,206 @@
package enginuity;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Point;
import java.io.File;
import java.io.Serializable;
import java.util.Vector;
public class Settings implements Serializable {
private Dimension windowSize = new Dimension(800, 600);
private Point windowLocation = new Point();
private int splitPaneLocation = 150;
private boolean windowMaximized = false;
private String romRevisionURL = "http://www.scoobypedia.co.uk/index.php/Knowledge/ECUVersionCompatibilityList";
private String supportURL = "http://www.enginuity.org";
private Vector<File> ecuDefinitionFiles = new Vector<File>();
private File lastImageDir = new File("images");
private boolean obsoleteWarning = true;
private boolean calcConflictWarning = true;
private boolean debug = false;
private Font tableFont = new Font("Arial", Font.BOLD, 12);
private Dimension cellSize = new Dimension(42, 18);
private Color maxColor = new Color(255, 155, 155);
private Color minColor = new Color(255, 255, 155);
private Color highlightColor = new Color(155, 155, 255);
private Color increaseBorder = new Color(255, 0, 0);
private Color decreaseBorder = new Color(0, 0, 255);
private Color axisColor = new Color(255, 255, 255);
private boolean singleTableView = false; //////
public Settings() {
//center window by default
addEcuDefinitionFile(new File("ecu_defs.xml"));
Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
windowLocation.move(((int)(screenSize.getWidth() - windowSize.getWidth()) / 2),
((int)(screenSize.getHeight() - windowSize.getHeight()) / 2));
}
public Dimension getWindowSize() {
return windowSize;
}
public Point getWindowLocation() {
return windowLocation;
}
public void setWindowSize(Dimension size) {
windowSize.setSize(size);
}
public void setWindowLocation(Point location) {
windowLocation.setLocation(location);
}
public File getEcuDefinitionFile() {
return ecuDefinitionFiles.elementAt(0);
}
public void addEcuDefinitionFile(File ecuDefinitionFile) {
if (ecuDefinitionFiles.size() == 0)
ecuDefinitionFiles.add(ecuDefinitionFile);
else ecuDefinitionFiles.set(0, ecuDefinitionFile);
}
public File getLastImageDir() {
return lastImageDir;
}
public void setLastImageDir(File lastImageDir) {
this.lastImageDir = lastImageDir;
}
public int getSplitPaneLocation() {
return splitPaneLocation;
}
public void setSplitPaneLocation(int splitPaneLocation) {
this.splitPaneLocation = splitPaneLocation;
}
public boolean isWindowMaximized() {
return windowMaximized;
}
public void setWindowMaximized(boolean windowMaximized) {
this.windowMaximized = windowMaximized;
}
public String getRomRevisionURL() {
return romRevisionURL;
}
public void setRomRevisionURL(String romRevisionURL) {
this.romRevisionURL = romRevisionURL;
}
public String getSupportURL() {
return supportURL;
}
public void setSupportURL(String supportURL) {
this.supportURL = supportURL;
}
public Font getTableFont() {
return tableFont;
}
public void setTableFont(Font tableFont) {
this.tableFont = tableFont;
}
public boolean isObsoleteWarning() {
return obsoleteWarning;
}
public void setObsoleteWarning(boolean obsoleteWarning) {
this.obsoleteWarning = obsoleteWarning;
}
public boolean isDebug() {
return debug;
}
public void setDebug(boolean debug) {
this.debug = debug;
}
public Dimension getCellSize() {
return cellSize;
}
public void setCellSize(Dimension cellSize) {
this.cellSize = cellSize;
}
public Color getMaxColor() {
return maxColor;
}
public void setMaxColor(Color maxColor) {
this.maxColor = maxColor;
}
public Color getMinColor() {
return minColor;
}
public void setMinColor(Color minColor) {
this.minColor = minColor;
}
public boolean isSingleTableView() {
return singleTableView;
}
public void setSingleTableView(boolean singleTableView) {
this.singleTableView = singleTableView;
}
public Color getHighlightColor() {
return highlightColor;
}
public void setHighlightColor(Color highlightColor) {
this.highlightColor = highlightColor;
}
public boolean isCalcConflictWarning() {
return calcConflictWarning;
}
public void setCalcConflictWarning(boolean calcConflictWarning) {
this.calcConflictWarning = calcConflictWarning;
}
public Color getIncreaseBorder() {
return increaseBorder;
}
public void setIncreaseBorder(Color increaseBorder) {
this.increaseBorder = increaseBorder;
}
public Color getDecreaseBorder() {
return decreaseBorder;
}
public void setDecreaseBorder(Color decreaseBorder) {
this.decreaseBorder = decreaseBorder;
}
public Color getAxisColor() {
return axisColor;
}
public void setAxisColor(Color axisColor) {
this.axisColor = axisColor;
}
}

View File

@ -0,0 +1,268 @@
package enginuity.maps;
import com.sun.corba.se.spi.activation._ActivatorImplBase;
import enginuity.maps.Scale;
import enginuity.maps.Table;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.Serializable;
import java.text.DecimalFormat;
import javax.swing.JLabel;
import javax.swing.border.LineBorder;
import org.nfunk.jep.*;
public class DataCell extends JLabel implements MouseListener, Serializable {
private int binValue = 0;
private int originalValue = 0;
private Scale scale = new Scale();
private String displayValue = "";
private Color scaledColor = new Color(0,0,0);
private Color highlightColor = new Color(155,155,255);
private Color increaseBorder = Color.RED;
private Color decreaseBorder = Color.BLUE;
private Boolean selected = false;
private Boolean highlighted = false;
private Table table;
private int x = 0;
private int y = 0;
private int compareValue = 0;
private int compareType = Table.COMPARE_OFF;
private int compareDisplay = Table.COMPARE_ABSOLUTE;
public DataCell() { }
public DataCell(Scale scale) {
this.scale = scale;
this.setHorizontalAlignment(CENTER);
this.setVerticalAlignment(CENTER);
this.setFont(new Font("Arial", Font.BOLD, 12));
this.setBorder(new LineBorder(Color.BLACK, 1));
this.setOpaque(true);
this.setVisible(true);
this.addMouseListener(this);
}
public void updateDisplayValue() {
DecimalFormat formatter = new DecimalFormat(scale.getFormat());
if (getCompareType() == Table.COMPARE_OFF) {
displayValue = formatter.format(calcDisplayValue(binValue, table.getScale().getExpression()));
} else {
if (getCompareDisplay() == Table.COMPARE_ABSOLUTE) {
displayValue = formatter.format(
calcDisplayValue(binValue, table.getScale().getExpression()) -
calcDisplayValue(compareValue, table.getScale().getExpression()));
/*System.out.println(calcDisplayValue(binValue, table.getScale().getExpression()) + " - " +
calcDisplayValue(compareValue, table.getScale().getExpression()) + //" = " +
"(" + compareValue + ") = " +
displayValue);*/
} else if (getCompareDisplay() == Table.COMPARE_PERCENT) {
double difference = calcDisplayValue(binValue, table.getScale().getExpression()) -
calcDisplayValue(compareValue, table.getScale().getExpression());
if (difference == 0) displayValue = "0%";
else displayValue = (int)(difference / calcDisplayValue(binValue, table.getScale().getExpression()) * 100)+"%";
}
}
setText(displayValue);
}
public double calcDisplayValue(int input, String expression) {
JEP parser = new JEP();
parser.initSymTab(); // clear the contents of the symbol table
parser.addVariable("x", input);
parser.parseExpression(expression);
return parser.getValue();
}
public void setColor(Color color) {
scaledColor = color;
if (!selected) super.setBackground(color);
}
public void setDisplayValue(String displayValue) {
this.displayValue = displayValue;
this.setText(displayValue);
}
public void setBinValue(int binValue) {
this.binValue = binValue;
// make sure it's in range
if (binValue < 0) {
this.setBinValue(0);
} else if (binValue > Math.pow(256, table.getStorageType()) - 1) {
this.setBinValue((int)(Math.pow(256, table.getStorageType()) - 1));
}
this.updateDisplayValue();
}
public int getBinValue() {
return binValue;
}
public String toString() {
return displayValue;
}
public Boolean isSelected() {
return selected;
}
public void setSelected(Boolean selected) {
this.selected = selected;
if (selected) {
this.setBackground(getHighlightColor());
table.getFrame().getToolBar().setCoarseValue(Math.abs(table.getScale().getIncrement()));
} else {
this.setBackground(scaledColor);
}
requestFocus();
}
public void setHighlighted(Boolean highlighted) {
if (!table.isStatic()) {
this.highlighted = highlighted;
if (highlighted) {
this.setBackground(getHighlightColor());
} else {
if (!selected) this.setBackground(scaledColor);
}
}
}
public boolean isHighlighted() {
return highlighted;
}
public void mouseEntered(MouseEvent e) {
table.highlight(x, y);
}
public void mousePressed(MouseEvent e) {
if (!table.isStatic()) {
if (!e.isControlDown()) table.clearSelection();
table.startHighlight(x, y);
}
requestFocus();
}
public void mouseReleased(MouseEvent e) {
if (!table.isStatic()) {
table.stopHighlight();
}
}
public void mouseClicked(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void increment(int increment) {
if (table.getScale().getIncrement() < 0) increment = 0 - increment;
this.setBinValue(binValue + increment);
table.colorize();
}
public void setTable(Table table) {
this.table = table;
}
public void setXCoord(int x) {
this.x = x;
}
public void setYCoord(int y) {
this.y = y;
}
public int getOriginalValue() {
return originalValue;
}
public void setOriginalValue(int originalValue) {
this.originalValue = originalValue;
if (binValue != getOriginalValue()) {
this.setBorder(new LineBorder(Color.RED, 3));
} else {
this.setBorder(new LineBorder(Color.BLACK, 1));
}
}
public void undo() {
this.setBinValue(originalValue);
}
public void setRevertPoint() {
this.setOriginalValue(binValue);
}
public void setRealValue(String input) {
// create parser
if (!input.equalsIgnoreCase("x")) {
JEP parser = new JEP();
parser.initSymTab(); // clear the contents of the symbol table
parser.addVariable("x", Double.parseDouble(input));
parser.parseExpression(table.getScale().getByteExpression());
this.setBinValue((int)Math.round(parser.getValue()));
}
}
public Color getHighlightColor() {
return highlightColor;
}
public void setHighlightColor(Color highlightColor) {
this.highlightColor = highlightColor;
}
public Color getIncreaseBorder() {
return increaseBorder;
}
public void setIncreaseBorder(Color increaseBorder) {
this.increaseBorder = increaseBorder;
}
public Color getDecreaseBorder() {
return decreaseBorder;
}
public void setDecreaseBorder(Color decreaseBorder) {
this.decreaseBorder = decreaseBorder;
}
public int getCompareValue() {
return compareValue;
}
public void setCompareValue(int compareValue) {
this.compareValue = compareValue;
}
public int getCompareType() {
return compareType;
}
public void setCompareType(int compareType) {
this.compareType = compareType;
}
public int getCompareDisplay() {
return compareDisplay;
}
public void setCompareRealValue(String input) {
JEP parser = new JEP();
parser.initSymTab(); // clear the contents of the symbol table
parser.addVariable("x", Double.parseDouble(input));
parser.parseExpression(table.getScale().getByteExpression());
this.setCompareValue((int)Math.round(parser.getValue()));
}
public void setCompareDisplay(int compareDisplay) {
this.compareDisplay = compareDisplay;
}
}

153
src/enginuity/maps/Rom.java Normal file
View File

@ -0,0 +1,153 @@
package enginuity.maps;
import enginuity.ECUEditor;
import enginuity.swing.JProgressPane;
import enginuity.xml.TableNotFoundException;
import java.io.File;
import java.io.Serializable;
import java.util.Vector;
import javax.swing.JOptionPane;
//import Enginuity.
public class Rom implements Serializable {
private RomID romID = new RomID();
private String fileName = "";
private File fullFileName = new File(".");
private Vector<Table> tables = new Vector<Table>();
private ECUEditor container;
private byte[] binData;
public Rom() {
}
public void addTable(Table table) {
for (int i = 0; i < tables.size(); i++) {
if (tables.get(i).getName().equalsIgnoreCase(table.getName())) {
tables.remove(i);
break;
}
}
tables.add(table);
}
public Table getTable(String tableName) throws TableNotFoundException {
for (int i = 0; i < tables.size(); i++) {
if (tables.get(i).getName().equalsIgnoreCase(tableName)) {
return tables.get(i);
}
}
throw new TableNotFoundException();
}
public void removeTable(String tableName) {
for (int i = 0; i < tables.size(); i++) {
if (tables.get(i).getName().equalsIgnoreCase(tableName)) {
tables.remove(i);
}
}
}
public void populateTables(byte[] binData, JProgressPane progress) {
this.binData = binData;
for (int i = 0; i < getTables().size(); i++) {
// update progress
int currProgress = (int)((double)i / (double)getTables().size() * 40);
progress.update("Populating " + tables.get(i).getName() + " table...", 40 + currProgress);
try {
// if storageaddress has not been set (or is set to 0) omit table
if (tables.get(i).getStorageAddress() != 0) {
tables.get(i).populateTable(binData);
} else {
tables.remove(i);
// decrement i because length of vector has changed
i--;
}
} catch (ArrayIndexOutOfBoundsException ex) {
new JOptionPane().showMessageDialog(container, "Storage address for table \"" + tables.get(i).getName() +
"\" is out of bounds.\nPlease check ECU definition file.", "ECU Definition Error", JOptionPane.ERROR_MESSAGE);
tables.removeElementAt(i);
} catch (NullPointerException ex) {
new JOptionPane().showMessageDialog(container, "There was an error loading table " + tables.get(i).getName(), "ECU Definition Error", JOptionPane.ERROR_MESSAGE);
tables.removeElementAt(i);
}
}
}
public void setRomID(RomID romID) {
this.romID = romID;
}
public RomID getRomID() {
return romID;
}
public String getRomIDString() {
return romID.getXmlid();
}
public String toString() {
String output = "";
output = output + "\n---- Rom ----" + romID.toString();
for (int i = 0; i < getTables().size(); i++) {
output = output + getTables().get(i);
}
output = output + "\n---- End Rom ----";
return output;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public Vector<Table> getTables() {
return tables;
}
public ECUEditor getContainer() {
return container;
}
public void setContainer(ECUEditor container) {
this.container = container;
// apply settings to tables
for (int i = 0; i < tables.size(); i++) {
tables.get(i).finalize(container.getSettings());
tables.get(i).resize();
}
}
public byte[] saveFile() {
for (int i = 0; i < tables.size(); i++) {
tables.get(i).saveFile(binData);
}
return binData;
}
public void closeImage() {
for (int i = 0; i < tables.size(); i++) {
tables.get(i).getFrame().dispose();
}
}
public int getRealFileSize() {
return binData.length;
}
public File getFullFileName() {
return fullFileName;
}
public void setFullFileName(File fullFileName) {
this.fullFileName = fullFileName;
this.setFileName(fullFileName.getName());
}
}

View File

@ -0,0 +1,173 @@
//ECU version definition
package enginuity.maps;
import java.io.Serializable;
public class RomID implements Serializable {
private String xmlid = "";//ID stored in XML
private int internalIdAddress = 0;//address of ECU version in image
private String internalIdString = "";//ID stored in image
private String caseId = "";//ECU hardware version
private String ecuId = "";
private String make = "";//manufacturer
private String market = "";
private String model = "";
private String subModel = "";//trim, ie WRX
private String transmission = "";
private int year = 0;
private String flashMethod = "";//flash method string used for ecuflash
private String memModel = "";//model used for reflashing with ecuflash
private int fileSize = 0;
private int ramOffset = 0;
private boolean obsolete = false; // whether a more recent revision exists
public String toString() {
return "\n ---- RomID " + xmlid + " ----" +
"\n Internal ID Address: " + internalIdAddress +
"\n Internal ID String: " + internalIdString +
"\n Case ID: " + caseId +
"\n ECU ID: " + ecuId +
"\n Make: " + make +
"\n Market: " + market +
"\n Model: " + model +
"\n Submodel: " + subModel +
"\n Transmission: " + transmission +
"\n Year: " + year +
"\n Flash Method: " + flashMethod +
"\n Memory Model: " + memModel +
"\n ---- End RomID " + xmlid + " ----";
}
public RomID() {
}
public String getXmlid() {
return xmlid;
}
public void setXmlid(String xmlid) {
this.xmlid = xmlid;
}
public int getInternalIdAddress() {
return internalIdAddress;
}
public void setInternalIdAddress(int internalIdAddress) {
this.internalIdAddress = internalIdAddress;
}
public String getInternalIdString() {
return internalIdString;
}
public void setInternalIdString(String internalIdString) {
this.internalIdString = internalIdString;
}
public String getCaseId() {
return caseId;
}
public void setCaseId(String caseId) {
this.caseId = caseId;
}
public String getEcuId() {
return ecuId;
}
public void setEcuId(String ecuId) {
this.ecuId = ecuId;
}
public String getMake() {
return make;
}
public void setMake(String make) {
this.make = make;
}
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getSubModel() {
return subModel;
}
public void setSubModel(String subModel) {
this.subModel = subModel;
}
public String getTransmission() {
return transmission;
}
public void setTransmission(String transmission) {
this.transmission = transmission;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public String getFlashMethod() {
return flashMethod;
}
public void setFlashMethod(String flashMethod) {
this.flashMethod = flashMethod;
}
public String getMemModel() {
return memModel;
}
public void setMemModel(String memModel) {
this.memModel = memModel;
}
public int getRamOffset() {
return ramOffset;
}
public void setRamOffset(int ramOffset) {
this.ramOffset = ramOffset;
}
public int getFileSize() {
return fileSize;
}
public void setFileSize(int fileSize) {
this.fileSize = fileSize;
}
public boolean isObsolete() {
return obsolete;
}
public void setObsolete(boolean obsolete) {
this.obsolete = obsolete;
}
}

View File

@ -0,0 +1,77 @@
//This object defines the scaling factor and offset for calculating real values
package enginuity.maps;
import java.io.Serializable;
public class Scale implements Serializable {
public static final int LINEAR = 1;
public static final int INVERSE = 2;
private String unit;
private String expression = "x";
private String byteExpression = "x";
private String format;
private int increment;
public Scale() {
}
public String toString() {
return "\n ---- Scale ----" +
"\n Expression: " + getExpression() +
"\n Unit: " + getUnit() +
"\n ---- End Scale ----";
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
public String getFormat() {
return format;
}
public void setFormat(String format) {
this.format = format;
}
public String getExpression() {
return expression;
}
public void setExpression(String expression) {
this.expression = expression;
}
public int getIncrement() {
return increment;
}
public void setIncrement(int increment) {
this.increment = increment;
}
public boolean isReady() {
if (unit == null) return false;
else if (expression == null) return false;
else if (format == null) return false;
else if (increment < 1) return false;
return true;
}
public String getByteExpression() {
return byteExpression;
}
public void setByteExpression(String byteExpression) {
this.byteExpression = byteExpression;
}
}

View File

@ -0,0 +1,868 @@
package enginuity.maps;
import enginuity.Settings;
import enginuity.xml.RomAttributeParser;
import enginuity.swing.TableFrame;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.io.Serializable;
import java.util.StringTokenizer;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.InputMap;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.border.LineBorder;
import org.nfunk.jep.JEP;
public abstract class Table extends JPanel implements Serializable {
public static final int ENDIAN_LITTLE= 1;
public static final int ENDIAN_BIG = 2;
public static final int TABLE_1D = 1;
public static final int TABLE_2D = 2;
public static final int TABLE_3D = 3;
public static final int TABLE_X_AXIS = 4;
public static final int TABLE_Y_AXIS = 5;
public static final int COMPARE_OFF = 0;
public static final int COMPARE_ORIGINAL = 1;
public static final int COMPARE_TABLE = 2;
public static final int COMPARE_PERCENT = 0;
public static final int COMPARE_ABSOLUTE = 1;
protected String name;
protected int type;
protected String category = "Other";
protected String description = "";
protected Scale scale = new Scale();
protected int storageAddress;
protected int storageType;//number of bytes per cell
protected int endian;
protected boolean flip;
protected DataCell[] data = new DataCell[0];
protected boolean isStatic = false;
protected boolean beforeRam = false;
protected int ramOffset = 0;
protected BorderLayout borderLayout = new BorderLayout();
protected GridLayout centerLayout = new GridLayout(1,1,0,0);
protected JPanel centerPanel = new JPanel(centerLayout);
protected TableFrame frame;
protected int verticalOverhead = 103;
protected int horizontalOverhead = 2;
protected int cellHeight = 18;
protected int cellWidth = 42;
protected int minHeight = 100;
protected int minWidth = 370;
protected Rom container;
protected int highlightX;
protected int highlightY;
protected boolean highlight = false;
protected Table axisParent;
protected Color maxColor;
protected Color minColor;
protected boolean isAxis = false;
protected int compareType = 0;
protected int compareDisplay = 1;
public Table() {
this.setLayout(borderLayout);
this.add(centerPanel, BorderLayout.CENTER);
centerPanel.setVisible(true);
// key binding actions
Action rightAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
cursorRight();
}
};
Action leftAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
cursorLeft();
}
};
Action downAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
cursorDown();
}
};
Action upAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
cursorUp();
}
};
Action incCoarseAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
frame.getToolBar().incrementCoarse();
}
};
Action decCoarseAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
frame.getToolBar().decrementCoarse();
}
};
Action incFineAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
frame.getToolBar().incrementFine();
}
};
Action decFineAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
frame.getToolBar().decrementFine();
}
};
Action num0Action = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
getFrame().getToolBar().focusSetValue('0');
}
};
Action num1Action = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
getFrame().getToolBar().focusSetValue('1');
}
};
Action num2Action = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
getFrame().getToolBar().focusSetValue('2');
}
};
Action num3Action = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
getFrame().getToolBar().focusSetValue('3');
}
};
Action num4Action = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
getFrame().getToolBar().focusSetValue('4');
}
};
Action num5Action = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
getFrame().getToolBar().focusSetValue('5');
}
};
Action num6Action = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
getFrame().getToolBar().focusSetValue('6');
}
};
Action num7Action = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
getFrame().getToolBar().focusSetValue('7');
}
};
Action num8Action = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
getFrame().getToolBar().focusSetValue('8');
}
};
Action num9Action = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
getFrame().getToolBar().focusSetValue('9');
}
};
Action copyAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
copySelection();
}
};
Action pasteAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
paste();
}
};
// set input mapping
InputMap im = getInputMap(this.WHEN_IN_FOCUSED_WINDOW);
KeyStroke right = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0);
KeyStroke left = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0);
KeyStroke up = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0);
KeyStroke down = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0);
KeyStroke decrement = KeyStroke.getKeyStroke('-');
KeyStroke increment = KeyStroke.getKeyStroke('+');
KeyStroke decrement2 = KeyStroke.getKeyStroke("control DOWN");
KeyStroke increment2 = KeyStroke.getKeyStroke("control UP");
KeyStroke decrement3 = KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, KeyEvent.CTRL_DOWN_MASK);
KeyStroke increment3 = KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, KeyEvent.CTRL_DOWN_MASK);
KeyStroke num0 = KeyStroke.getKeyStroke('0');
KeyStroke num1 = KeyStroke.getKeyStroke('1');
KeyStroke num2 = KeyStroke.getKeyStroke('2');
KeyStroke num3 = KeyStroke.getKeyStroke('3');
KeyStroke num4 = KeyStroke.getKeyStroke('4');
KeyStroke num5 = KeyStroke.getKeyStroke('5');
KeyStroke num6 = KeyStroke.getKeyStroke('6');
KeyStroke num7 = KeyStroke.getKeyStroke('7');
KeyStroke num8 = KeyStroke.getKeyStroke('8');
KeyStroke num9 = KeyStroke.getKeyStroke('9');
KeyStroke copy = KeyStroke.getKeyStroke("control C");
KeyStroke paste = KeyStroke.getKeyStroke("control V");
im.put(right, "right");
im.put(left, "left");
im.put(up, "up");
im.put(down, "down");
im.put(increment, "incCoarseAction");
im.put(decrement, "decCoarseAction");
im.put(increment2, "incCoarseAction");
im.put(decrement2, "decCoarseAction");
im.put(increment3, "incFineAction");
im.put(decrement3, "decFineAction");
im.put(num0, "num0Action");
im.put(num1, "num1Action");
im.put(num2, "num2Action");
im.put(num3, "num3Action");
im.put(num4, "num4Action");
im.put(num5, "num5Action");
im.put(num6, "num6Action");
im.put(num7, "num7Action");
im.put(num8, "num8Action");
im.put(num9, "num9Action");
im.put(copy, "copyAction");
im.put(paste, "pasteAction");
getActionMap().put(im.get(right), rightAction);
getActionMap().put(im.get(left), leftAction);
getActionMap().put(im.get(up), upAction);
getActionMap().put(im.get(down), downAction);
getActionMap().put(im.get(increment), incCoarseAction);
getActionMap().put(im.get(decrement), decCoarseAction);
getActionMap().put(im.get(increment2), incCoarseAction);
getActionMap().put(im.get(decrement2), decCoarseAction);
getActionMap().put(im.get(increment3), incFineAction);
getActionMap().put(im.get(decrement3), decFineAction);
getActionMap().put(im.get(num0), num0Action);
getActionMap().put(im.get(num1), num1Action);
getActionMap().put(im.get(num2), num2Action);
getActionMap().put(im.get(num3), num3Action);
getActionMap().put(im.get(num4), num4Action);
getActionMap().put(im.get(num5), num5Action);
getActionMap().put(im.get(num6), num6Action);
getActionMap().put(im.get(num7), num7Action);
getActionMap().put(im.get(num8), num8Action);
getActionMap().put(im.get(num9), num9Action);
getActionMap().put(im.get(copy), copyAction);
getActionMap().put(im.get(paste), pasteAction);
this.setInputMap(this.WHEN_FOCUSED, im);
}
public DataCell[] getData() {
return data;
}
public void setData(DataCell[] data) {
this.data = data;
}
public void populateTable(byte[] input) throws ArrayIndexOutOfBoundsException {
if (!isStatic) {
if (!beforeRam) ramOffset = container.getRomID().getRamOffset();
for (int i = 0; i < data.length; i++) {
if (data[i] == null) {
data[i] = new DataCell(scale);
data[i].setTable(this);
data[i].setBinValue(RomAttributeParser.parseByteValue(input, endian, storageAddress + i * storageType - ramOffset, storageType));
data[i].setPreferredSize(new Dimension(cellWidth, cellHeight));
centerPanel.add(data[i]);
data[i].setYCoord(i);
data[i].setOriginalValue(data[i].getBinValue());
}
}
}
//this.colorize();
}
public int getType() {
return type;
}
public DataCell getDataCell(int location) {
return data[location];
}
public void setType(int type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Scale getScale() {
return scale;
}
public void setScale(Scale scale) {
this.scale = scale;
}
public int getStorageAddress() {
return storageAddress;
}
public void setStorageAddress(int storageAddress) {
this.storageAddress = storageAddress;
}
public int getStorageType() {
return storageType;
}
public void setStorageType(int storageType) {
this.storageType = storageType;
}
public int getEndian() {
return endian;
}
public void setEndian(int endian) {
this.endian = endian;
}
public void setDataSize(int size) {
data = new DataCell[size];
}
public int getDataSize() {
return data.length;
}
public boolean getFlip() {
return flip;
}
public void setFlip(boolean flipY) {
this.flip = flip;
}
public String toString() {
/*String output = "\n ---- Table " + name + " ----" +
scale +
"\n Category: " + category +
"\n Type: " + type +
"\n Description: " + description +
"\n Storage Address: " + Integer.toHexString(storageAddress) +
"\n Storage Type: " + storageType +
"\n Endian: " + endian +
"\n Flip: " + flip +
"\n ---- End Table " + name + " ----";
for (int i = 0; i < data.length; i++) {
if (data[i] != null) {
output = output + "\nData: " + data[i];
}
}
return output;*/
return name;
}
public boolean isStatic() {
return isStatic;
}
public void setIsStatic(boolean isStatic) {
this.isStatic = isStatic;
}
public void addStaticDataCell(DataCell input) {
if (isStatic) {
for (int i = 0; i < data.length; i++) {
if (data[i] == null) {
data[i] = input;
break;
}
}
}
}
public void colorize() {
if (compareType == COMPARE_OFF) {
if (!isStatic && !isAxis) {
int high = 0;
int low = 999999999;
for (int i = 0; i < getDataSize(); i++) {
if (data[i].getBinValue() > high) {
high = data[i].getBinValue();
}
if (data[i].getBinValue() < low) {
low = data[i].getBinValue();
}
}
for (int i = 0; i < getDataSize(); i++) {
double scale = (double)(data[i].getBinValue() - low) / (high - low);
int r = (int)((maxColor.getRed() - minColor.getRed()) * scale) + minColor.getRed();
int g = (int)((maxColor.getGreen() - minColor.getGreen()) * scale) + minColor.getGreen();
int b = (int)((maxColor.getBlue() - minColor.getBlue()) * scale) + minColor.getBlue();
data[i].setColor(new Color(r, g, b));
}
} else { // is static/axis
for (int i = 0; i < getDataSize(); i++) {
data[i].setColor(axisParent.getRom().getContainer().getSettings().getAxisColor());
data[i].setOpaque(true);
data[i].setBorder(new LineBorder(Color.BLACK, 1));
data[i].setHorizontalAlignment(data[i].CENTER);
}
}
} else { // comparing is on
if (!isStatic) {
int high = 0;
// determine ratios
for (int i = 0; i < getDataSize(); i++) {
if (Math.abs(data[i].getBinValue() - data[i].getOriginalValue()) > high) {
high = Math.abs(data[i].getBinValue() - data[i].getOriginalValue());
}
}
// colorize
for (int i = 0; i < getDataSize(); i++) {
int cellDifference = Math.abs(data[i].getBinValue() - data[i].getOriginalValue());
double scale;
if (high == 0) scale = 0;
else scale = (double)cellDifference / (double)high;
int r = (int)((maxColor.getRed() - minColor.getRed()) * scale) + minColor.getRed();
int g = (int)((maxColor.getGreen() - minColor.getGreen()) * scale) + minColor.getGreen();
int b = (int)((maxColor.getBlue() - minColor.getBlue()) * scale) + minColor.getBlue();
if (r > 255) r = 255;
if (g > 255) g = 255;
if (b > 255) b = 255;
if (r < 0) r = 0;
if (g < 0) g = 0;
if (b < 0) b = 0;
if (scale != 0) data[i].setColor(new Color(r, g, b));
else data[i].setColor(new Color(160,160,160));
// set border
if (data[i].getBinValue() > data[i].getOriginalValue()) {
data[i].setBorder(new LineBorder(getRom().getContainer().getSettings().getIncreaseBorder()));
} else if (data[i].getBinValue() < data[i].getOriginalValue()) {
data[i].setBorder(new LineBorder(getRom().getContainer().getSettings().getDecreaseBorder()));
} else {
data[i].setBorder(new LineBorder(Color.BLACK, 1));
}
}
}
}
// colorize border
if (!isStatic) {
for (int i = 0; i < getDataSize(); i++) {
if (data[i].getBinValue() > data[i].getOriginalValue()) {
data[i].setBorder(new LineBorder(getRom().getContainer().getSettings().getIncreaseBorder()));
} else if (data[i].getBinValue() < data[i].getOriginalValue()) {
data[i].setBorder(new LineBorder(getRom().getContainer().getSettings().getDecreaseBorder()));
} else {
data[i].setBorder(new LineBorder(Color.BLACK, 1));
}
}
}
}
public void setFrame(TableFrame frame) {
this.frame = frame;
frame.setSize(getFrameSize());
}
public Dimension getFrameSize() {
int height = verticalOverhead + cellHeight;
int width = horizontalOverhead + data.length * cellWidth;
if (height < minHeight) height = minHeight;
if (width < minWidth) width = minWidth;
return new Dimension(width, height);
}
public TableFrame getFrame() {
return frame;
}
public void increment(int increment) {
if (!isStatic) {
for (int i = 0; i < data.length; i++) {
if (data[i].isSelected()) data[i].increment(increment);
}
}
}
public void setRealValue(String realValue) {
if (!isStatic) {
for (int i = 0; i < data.length; i++) {
if (data[i].isSelected()) data[i].setRealValue(realValue);
}
}
colorize();
}
public Rom getRom() {
return container;
}
public void setRom(Rom container) {
this.container = container;
}
public void clearSelection() {
for (int i = 0; i < data.length; i++) {
data[i].setSelected(false);
}
}
public void startHighlight(int x, int y) {
this.highlightY = y;
this.highlightX = x;
highlight = true;
highlight(x, y);
}
public void highlight(int x, int y) {
if (highlight) {
for (int i = 0; i < data.length; i++) {
if ((i >= highlightY && i <= y) || (i <= highlightY && i >= y)) {
data[i].setHighlighted(true);
} else {
data[i].setHighlighted(false);
}
}
}
}
public void stopHighlight() {
highlight = false;
// loop through, selected and un-highlight
for (int i = 0; i < data.length; i++) {
if (data[i].isHighlighted()) {
data[i].setSelected(true);
data[i].setHighlighted(false);
}
}
}
public abstract void cursorUp();
public abstract void cursorDown();
public abstract void cursorLeft();
public abstract void cursorRight();
public Table getAxisParent() {
return axisParent;
}
public void setAxisParent(Table axisParent) {
this.axisParent = axisParent;
}
public void setRevertPoint() {
if (!isStatic) {
for (int i = 0; i < data.length; i++) {
data[i].setOriginalValue(data[i].getBinValue());
}
}
colorize();
}
public void undoAll() {
if (!isStatic) {
for (int i = 0; i < data.length; i++) {
data[i].setBinValue(data[i].getOriginalValue());
}
}
colorize();
}
public void undoSelected() {
if (!isStatic) {
for (int i = 0; i < data.length; i++) {
if (data[i].isSelected()) data[i].setBinValue(data[i].getOriginalValue());
}
}
colorize();
}
public byte[] saveFile(byte[] binData) {
if (!isStatic) {
for (int i = 0; i < data.length; i++) {
// need to deal with storage type (num bytes)
byte[] output = RomAttributeParser.parseIntegerValue(data[i].getBinValue(), endian, storageType);
for (int z = 0; z < storageType; z++) {
binData[i * storageType + z + storageAddress - ramOffset] = output[z];
}
}
}
return binData;
}
public boolean isBeforeRam() {
return beforeRam;
}
public void setBeforeRam(boolean beforeRam) {
this.beforeRam = beforeRam;
}
public void addKeyListener(KeyListener listener) {
super.addKeyListener(listener);
for (int i = 0; i < data.length; i++) {
byte[] output = RomAttributeParser.parseIntegerValue(data[i].getBinValue(), endian, storageType);
for (int z = 0; z < storageType; z++) {
data[i].addKeyListener(listener);
}
}
}
public void selectCellAt(int y) {
if (type == TABLE_X_AXIS || type == TABLE_Y_AXIS) axisParent.clearSelection();
else clearSelection();
data[y].setSelected(true);
highlightY = y;
}
public void copySelection() {
// find bounds of selection
// coords[0] = x min, y min, x max, y max
String newline = System.getProperty("line.separator");
String output ="[Selection1D]" + newline;
boolean copy = false;
int[] coords = new int[2];
coords[0] = this.getDataSize();
for (int i = 0; i < this.getDataSize(); i++) {
if (data[i].isSelected()) {
if (i < coords[0]) {
coords[0] = i;
copy = true;
}
if (i > coords[1]) {
coords[1] = i;
copy = true;
}
}
}
//make a string of the selection
for (int i = coords[0]; i <= coords[1]; i++) {
if (data[i].isSelected()) output = output + data[i].getText();
else output = output + "x"; // x represents non-selected cell
if (i < coords[1]) output = output + "\t";
}
//copy to clipboard
if (copy) Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(output), null);
}
public StringBuffer getTableAsString() {
//make a string of the selection
StringBuffer output = new StringBuffer("");
for (int i = 0; i < getDataSize(); i++) {
output.append(data[i].getText());
if (i < getDataSize() - 1) output.append("\t");
}
return output;
}
public void copyTable() {
String newline = System.getProperty("line.separator");
StringBuffer output = new StringBuffer("[Table1D]" + newline);
for (int i = 0; i < getDataSize(); i++) {
output.append(data[i].getText());
if (i < getDataSize() - 1) output.append("\t");
}
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(output+""), null);
}
public String getCellAsString(int index) {
return data[index].getText();
}
public void pasteValues(String[] input) {
//set real values
for (int i = 0; i < input.length; i++) {
try {
Double.parseDouble(input[i]);
data[i].setRealValue(input[i]);
} catch (NumberFormatException ex) { /* not a number, do nothing */ }
}
}
public void paste() {
StringTokenizer st = new StringTokenizer("");
try {
String input = (String)Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null).getTransferData(DataFlavor.stringFlavor);
st = new StringTokenizer(input);
} catch (UnsupportedFlavorException ex) { /* wrong paste type -- do nothing */
} catch (IOException ex) { }
String pasteType = st.nextToken();
if (pasteType.equalsIgnoreCase("[Table1D]")) { // copied entire table
int i = 0;
while (st.hasMoreTokens()) {
String currentToken = st.nextToken();
try {
if (!data[i].getText().equalsIgnoreCase(currentToken)) data[i].setRealValue(currentToken);
} catch (ArrayIndexOutOfBoundsException ex) { /* table larger than target, ignore*/ }
i++;
}
} else if (pasteType.equalsIgnoreCase("[Selection1D]")) { // copied selection
if (data[highlightY].isSelected()) {
int i = 0;
while (st.hasMoreTokens()) {
try {
data[highlightY + i].setRealValue(st.nextToken());
} catch (ArrayIndexOutOfBoundsException ex) { /* paste larger than target, ignore */ }
i++;
}
}
}
}
public void pasteCompare() {
StringTokenizer st = new StringTokenizer("");
try {
String input = (String)Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null).getTransferData(DataFlavor.stringFlavor);
st = new StringTokenizer(input);
} catch (UnsupportedFlavorException ex) { /* wrong paste type -- do nothing */
} catch (IOException ex) { }
String pasteType = st.nextToken();
if (pasteType.equalsIgnoreCase("[Table1D]")) { // copied entire table
int i = 0;
while (st.hasMoreTokens()) {
String currentToken = st.nextToken();
try {
if (!data[i].getText().equalsIgnoreCase(currentToken)) data[i].setCompareRealValue(currentToken);
} catch (ArrayIndexOutOfBoundsException ex) { /* table larger than target, ignore*/ }
i++;
}
}
}
public void finalize(Settings settings) {
// apply settings to cells
for (int i = 0; i < getDataSize(); i++) {
this.setMaxColor(settings.getMaxColor());
this.setMinColor(settings.getMinColor());
data[i].setHighlightColor(settings.getHighlightColor());
data[i].setIncreaseBorder(settings.getIncreaseBorder());
data[i].setDecreaseBorder(settings.getDecreaseBorder());
data[i].setFont(settings.getTableFont());
data[i].repaint();
}
cellHeight = (int)settings.getCellSize().getHeight();
cellWidth = (int)settings.getCellSize().getWidth();
colorize();
validateScaling();
}
public void resize() {
frame.setSize(getFrameSize());
}
public Color getMaxColor() {
return maxColor;
}
public void setMaxColor(Color maxColor) {
this.maxColor = maxColor;
}
public Color getMinColor() {
return minColor;
}
public void setMinColor(Color minColor) {
this.minColor = minColor;
}
public abstract void setAxisColor(Color color);
public void validateScaling() {
JEP parser = new JEP();
parser.initSymTab(); // clear the contents of the symbol table
parser.addVariable("x", 5);
parser.parseExpression(scale.getExpression());
double toReal = parser.getValue();
parser.addVariable("x", toReal);
parser.parseExpression(scale.getByteExpression());
if ((int)Math.round(parser.getValue()) != 5 && container.getContainer().getSettings().isCalcConflictWarning()) {
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(3, 1));
panel.add(new JLabel("The real value and byte value conversion expressions for table " + name + " are invalid."));
panel.add(new JLabel("To real value: " + scale.getExpression() + "\n" +
"To byte: " + scale.getByteExpression()));
JCheckBox check = new JCheckBox("Always display this message", true);
check.setHorizontalAlignment(check.RIGHT);
panel.add(check);
check.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
getRom().getContainer().getSettings().setCalcConflictWarning(((JCheckBox)e.getSource()).isSelected());
}
}
);
new JOptionPane().showMessageDialog(container.getContainer(), panel,
"Warning", JOptionPane.ERROR_MESSAGE);
}
}
public void compare(int compareType) {
this.compareType = compareType;
for (int i = 0; i < getDataSize(); i++) {
if (compareType == this.COMPARE_ORIGINAL) data[i].setCompareValue(data[i].getOriginalValue());
data[i].setCompareType(compareType);
data[i].setCompareDisplay(compareDisplay);
data[i].updateDisplayValue();
}
colorize();
}
public void setCompareDisplay(int compareDisplay) {
this.compareDisplay = compareDisplay;
compare(compareType);
colorize();
}
}

View File

@ -0,0 +1,131 @@
package enginuity.maps;
import enginuity.maps.Table;
import enginuity.maps.Table3D;
import java.awt.BorderLayout;
import java.awt.Color;
import java.io.Serializable;
import javax.swing.JLabel;
public class Table1D extends Table implements Serializable {
private Color axisColor = new Color(255, 255, 255);
public Table1D() {
super();
}
public void populateTable(byte[] input) {
centerLayout.setRows(1);
centerLayout.setColumns(this.getDataSize());
super.populateTable(input);
// add to table
for (int i = 0; i < this.getDataSize(); i++) {
centerPanel.add(this.getDataCell(i));
}
this.add(new JLabel(name + " (" + scale.getUnit() + ")", JLabel.CENTER), BorderLayout.NORTH);
}
public String toString() {
return super.toString() + " (1D)";
}
public boolean isIsAxis() {
return isAxis;
}
public void setIsAxis(boolean isAxis) {
this.isAxis = isAxis;
}
public void clearSelection() {
super.clearSelection();
//if (isAxis) axisParent.clearSelection();
}
public void clearSelection(boolean calledByParent) {
if (calledByParent) {
super.clearSelection();
} else {
this.clearSelection();
}
}
public void colorize() {
super.colorize();
}
public void cursorUp() {
if (type == Table.TABLE_Y_AXIS) {
if (highlightY > 0 && data[highlightY].isSelected()) selectCellAt(highlightY - 1);
} else if (type == Table.TABLE_X_AXIS) {
// Y axis is on top.. nothing happens
} else if (type == Table.TABLE_1D) {
// no where to move up to
}
}
public void cursorDown() {
if (type == Table.TABLE_Y_AXIS) {
if (axisParent.getType() == Table.TABLE_3D) {
if (highlightY < getDataSize() - 1 && data[highlightY].isSelected()) selectCellAt(highlightY + 1);
} else if (axisParent.getType() == Table.TABLE_2D) {
if (data[highlightY].isSelected()) axisParent.selectCellAt(highlightY);
}
} else if (type == Table.TABLE_X_AXIS && data[highlightY].isSelected()) {
((Table3D)axisParent).selectCellAt(highlightY, this);
} else if (type == Table.TABLE_1D) {
// no where to move down to
}
}
public void cursorLeft() {
if (type == Table.TABLE_Y_AXIS) {
// X axis is on left.. nothing happens
if (axisParent.getType() == Table.TABLE_2D) {
if (data[highlightY].isSelected()) selectCellAt(highlightY - 1);
}
} else if (type == Table.TABLE_X_AXIS && data[highlightY].isSelected()) {
if (highlightY > 0) selectCellAt(highlightY - 1);
} else if (type == Table.TABLE_1D && data[highlightY].isSelected()) {
if (highlightY > 0) selectCellAt(highlightY - 1);
}
}
public void cursorRight() {
if (type == Table.TABLE_Y_AXIS && data[highlightY].isSelected()) {
if (axisParent.getType() == Table.TABLE_3D) ((Table3D)axisParent).selectCellAt(highlightY, this);
else if (axisParent.getType() == Table.TABLE_2D) selectCellAt(highlightY + 1);
} else if (type == Table.TABLE_X_AXIS && data[highlightY].isSelected()) {
if (highlightY < getDataSize() - 1) selectCellAt(highlightY + 1);
} else if (type == Table.TABLE_1D && data[highlightY].isSelected()) {
if (highlightY < getDataSize() - 1) selectCellAt(highlightY + 1);
}
}
public void startHighlight(int x, int y) {
if (isAxis) axisParent.clearSelection();
super.startHighlight(x, y);
}
public StringBuffer getTableAsString() {
StringBuffer output = new StringBuffer("");
for (int i = 0; i < getDataSize(); i++) {
output.append(data[i].getText());
if (i < getDataSize() - 1) output.append("\t");
}
return output;
}
public String getCellAsString(int index) {
return data[index].getText();
}
public Color getAxisColor() {
return axisColor;
}
public void setAxisColor(Color axisColor) {
this.axisColor = axisColor;
}
}

View File

@ -0,0 +1,244 @@
package enginuity.maps;
import enginuity.maps.Table;
import enginuity.maps.Table1D;
import enginuity.Settings;
import enginuity.swing.TableFrame;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.io.Serializable;
import java.util.StringTokenizer;
import javax.swing.JLabel;
public class Table2D extends Table implements Serializable {
private Table1D axis = new Table1D();
public Table2D() {
super();
verticalOverhead += 18;
}
public Table1D getAxis() {
return axis;
}
public void setAxis(Table1D axis) {
this.axis = axis;
}
public String toString() {
return super.toString() + " (2D)";// + axis;
}
public void colorize() {
super.colorize();
axis.colorize();
}
public void setFrame(TableFrame frame) {
this.frame = frame;
axis.setFrame(frame);
frame.setSize(getFrameSize());
}
public Dimension getFrameSize() {
int height = verticalOverhead + cellHeight * 2;
int width = horizontalOverhead + data.length * cellWidth;
if (height < minHeight) height = minHeight;
if (width < minWidth) width = minWidth;
return new Dimension(width, height);
}
public void finalize(Settings settings) {
this.setAxisColor(settings.getAxisColor());
axis.finalize(settings);
super.finalize(settings);
}
public void populateTable(byte[] input) throws ArrayIndexOutOfBoundsException {
centerLayout.setRows(2);
centerLayout.setColumns(this.getDataSize());
try {
axis.setRom(container);
axis.populateTable(input);
super.populateTable(input);
} catch (ArrayIndexOutOfBoundsException ex) {
throw new ArrayIndexOutOfBoundsException();
}
// add to table
for (int i = 0; i < this.getDataSize(); i++) {
centerPanel.add(axis.getDataCell(i));
}
for (int i = 0; i < this.getDataSize(); i++) {
centerPanel.add(this.getDataCell(i));
}
this.add(new JLabel(axis.getName() + " (" + axis.getScale().getUnit() + ")", JLabel.CENTER), BorderLayout.NORTH);
this.add(new JLabel(name + " (" + scale.getUnit() + ")", JLabel.CENTER), BorderLayout.SOUTH);
//this.colorize();
}
public void increment(int increment) {
super.increment(increment);
axis.increment(increment);
}
public void clearSelection() {
axis.clearSelection(true);
for (int i = 0; i < data.length; i++) {
data[i].setSelected(false);
}
}
public void setRevertPoint() {
super.setRevertPoint();
axis.setRevertPoint();
}
public void undoAll() {
super.undoAll();
axis.undoAll();
}
public void undoSelected() {
super.undoSelected();
axis.undoSelected();
}
public byte[] saveFile(byte[] binData) {
binData = super.saveFile(binData);
binData = axis.saveFile(binData);
return binData;
}
public void setRealValue(String realValue) {
axis.setRealValue(realValue);
super.setRealValue(realValue);
}
public void addKeyListener(KeyListener listener) {
super.addKeyListener(listener);
axis.addKeyListener(listener);
}
public void selectCellAt(int y, Table1D axisType) {
selectCellAt(y);
}
public void cursorUp() {
if (!axis.isStatic() && data[highlightY].isSelected()) axis.selectCellAt(highlightY);
}
public void cursorDown() {
axis.cursorDown();
}
public void cursorLeft() {
if (highlightY > 0 && data[highlightY].isSelected()) selectCellAt(highlightY - 1);
else axis.cursorLeft();
}
public void cursorRight() {
if (highlightY < data.length - 1 && data[highlightY].isSelected()) selectCellAt(highlightY + 1);
else axis.cursorRight();
}
public void startHighlight(int x, int y) {
axis.clearSelection();
super.startHighlight(x, y);
}
public void copySelection() {
super.copySelection();
axis.copySelection();
}
public void copyTable() {
// create string
String newline = System.getProperty("line.separator");
StringBuffer output = new StringBuffer("[Table2D]" + newline);
output.append(axis.getTableAsString() + newline);
output.append(super.getTableAsString());
//copy to clipboard
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(output+""), null);
}
public void paste() {
StringTokenizer st = new StringTokenizer("");
String input = "";
try {
input = (String)Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null).getTransferData(DataFlavor.stringFlavor);
st = new StringTokenizer(input);
} catch (UnsupportedFlavorException ex) { /* wrong paste type -- do nothing */
} catch (IOException ex) { }
String pasteType = st.nextToken();
if (pasteType.equalsIgnoreCase("[Table2D]")) { // Paste table
String newline = System.getProperty("line.separator");
String axisValues = "[Table1D]" + newline + st.nextToken(newline);
String dataValues = "[Table1D]" + newline + st.nextToken(newline);
// put axis in clipboard and paste
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(axisValues+""), null);
axis.paste();
// put datavalues in clipboard and paste
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(dataValues+""), null);
super.paste();
// reset clipboard
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(input+""), null);
} else if (pasteType.equalsIgnoreCase("[Selection1D]")) { // paste selection
if (data[highlightY].isSelected()) {
super.paste();
} else {
axis.paste();
}
}
}
public void pasteCompare() {
StringTokenizer st = new StringTokenizer("");
String input = "";
try {
input = (String)Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null).getTransferData(DataFlavor.stringFlavor);
st = new StringTokenizer(input);
} catch (UnsupportedFlavorException ex) { /* wrong paste type -- do nothing */
} catch (IOException ex) { }
String pasteType = st.nextToken();
if (pasteType.equalsIgnoreCase("[Table2D]")) { // Paste table
String newline = System.getProperty("line.separator");
String axisValues = "[Table1D]" + newline + st.nextToken(newline);
String dataValues = "[Table1D]" + newline + st.nextToken(newline);
// put axis in clipboard and paste
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(axisValues+""), null);
axis.pasteCompare();
// put datavalues in clipboard and paste
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(dataValues+""), null);
super.pasteCompare();
// reset clipboard
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(input+""), null);
}
}
public void setAxisColor(Color axisColor) {
axis.setAxisColor(axisColor);
}
public void validateScaling() {
super.validateScaling();
axis.validateScaling();
}
}

View File

@ -0,0 +1,731 @@
package enginuity.maps;
import enginuity.Settings;
import enginuity.xml.RomAttributeParser;
import enginuity.swing.TableFrame;
import enginuity.swing.VTextIcon;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.io.Serializable;
import java.util.StringTokenizer;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
public class Table3D extends Table implements Serializable {
private Table1D xAxis = new Table1D();
private Table1D yAxis = new Table1D();
private DataCell[][] data = new DataCell[1][1];
private boolean swapXY = false;
private boolean flipX = false;
private boolean flipY = false;
public Table3D() {
super();
verticalOverhead += 39;
horizontalOverhead += 5;
}
public Table1D getXAxis() {
return xAxis;
}
public void setXAxis(Table1D xAxis) {
this.xAxis = xAxis;
}
public Table1D getYAxis() {
return yAxis;
}
public void setYAxis(Table1D yAxis) {
this.yAxis = yAxis;
}
public boolean isSwapXY() {
return swapXY;
}
public void setSwapXY(boolean swapXY) {
this.swapXY = swapXY;
}
public boolean getFlipX() {
return flipX;
}
public void setFlipX(boolean flipX) {
this.flipX = flipX;
}
public boolean getFlipY() {
return flipY;
}
public void setFlipY(boolean flipY) {
this.flipY = flipY;
}
public void setSizeX(int size) {
data = new DataCell[size][data[0].length];
centerLayout.setColumns(size + 1);
}
public int getSizeX() {
return data.length;
}
public void setSizeY(int size) {
data = new DataCell[data.length][size];
centerLayout.setRows(size + 1);
}
public int getSizeY() {
return data[0].length;
}
public void populateTable(byte[] input) throws NullPointerException, ArrayIndexOutOfBoundsException {
// fill first empty cell
centerPanel.add(new JLabel());
if (!beforeRam) ramOffset = container.getRomID().getRamOffset();
// populate axiis
try {
xAxis.setRom(container);
xAxis.populateTable(input);
yAxis.setRom(container);
yAxis.populateTable(input);
} catch (ArrayIndexOutOfBoundsException ex) {
throw new ArrayIndexOutOfBoundsException();
}
for (int i = 0; i < xAxis.getDataSize(); i++) {
centerPanel.add(xAxis.getDataCell(i));
}
int offset = 0;
for (int x = 0; x < yAxis.getDataSize(); x++) {
centerPanel.add(yAxis.getDataCell(x));
for (int y = 0; y < xAxis.getDataSize(); y++) {
data[y][x] = new DataCell(scale);
data[y][x].setTable(this);
try {
data[y][x].setBinValue(
RomAttributeParser.parseByteValue(input,
endian,
storageAddress + offset * storageType - ramOffset,
storageType));
} catch (ArrayIndexOutOfBoundsException ex) {
throw new ArrayIndexOutOfBoundsException();
}
centerPanel.add(data[y][x]);
data[y][x].setXCoord(y);
data[y][x].setYCoord(x);
data[y][x].setOriginalValue(data[y][x].getBinValue());
offset++;
}
}
//this.colorize();
GridLayout topLayout = new GridLayout(2,1);
JPanel topPanel = new JPanel(topLayout);
this.add(topPanel, BorderLayout.NORTH);
topPanel.add(new JLabel(name + " (" + scale.getUnit() + ")", JLabel.CENTER), BorderLayout.NORTH);
topPanel.add(new JLabel(xAxis.getName() + " (" + xAxis.getScale().getUnit() + ")", JLabel.CENTER), BorderLayout.NORTH);
JLabel yLabel = new JLabel();
yLabel.setFont(new Font("Arial", Font.BOLD, 12));
VTextIcon icon = new VTextIcon(yLabel, yAxis.getName() + " (" + yAxis.getScale().getUnit()+ ")", VTextIcon.ROTATE_LEFT);
yLabel.setIcon(icon);
this.add(yLabel, BorderLayout.WEST);
}
public void colorize() {
if (compareType == COMPARE_OFF) {
if (!isStatic && !isAxis) {
int high = 0;
int low = 999999999;
for (int x = 0; x < data.length; x++) {
for (int y = 0; y < data[0].length; y++) {
if (data[x][y].getBinValue() > high) {
high = data[x][y].getBinValue();
}
if (data[x][y].getBinValue() < low) {
low = data[x][y].getBinValue();
}
}
}
for (int x = 0; x < data.length; x++) {
for (int y = 0; y < data[0].length; y++) {
double scale = Math.abs((double)(data[x][y].getBinValue() - low) / (high - low));
int r = (int)((maxColor.getRed() - minColor.getRed()) * scale) + minColor.getRed();
int g = (int)((maxColor.getGreen() - minColor.getGreen()) * scale) + minColor.getGreen();
int b = (int)((maxColor.getBlue() - minColor.getBlue()) * scale) + minColor.getBlue();
data[x][y].setColor(new Color(r, g, b));
}
}
}
} else { // comparing is on
if (!isStatic) {
int high = 0;
int low = 99999999;
// determine ratios
for (int x = 0; x < data.length; x++) {
for (int y = 0; y < data[0].length; y++) {
if (Math.abs(data[x][y].getBinValue() - data[x][y].getOriginalValue()) > high) {
high = Math.abs(data[x][y].getBinValue() - data[x][y].getOriginalValue());
} else if (Math.abs(data[x][y].getBinValue() - data[x][y].getOriginalValue()) < low) {
low = Math.abs(data[x][y].getBinValue() - data[x][y].getOriginalValue());
}
}
}
// colorize
for (int x = 0; x < data.length; x++) {
for (int y = 0; y < data[0].length; y++) {
int cellDifference = Math.abs(data[x][y].getBinValue() - data[x][y].getOriginalValue());
double scale;
if (high == 0) scale = 0;
else scale = (double)cellDifference / ((double)high - (double)low);
int r = (int)((maxColor.getRed() - minColor.getRed()) * scale) + minColor.getRed();
int g = (int)((maxColor.getGreen() - minColor.getGreen()) * scale) + minColor.getGreen();
int b = (int)((maxColor.getBlue() - minColor.getBlue()) * scale) + minColor.getBlue();
if (r > 255) r = 255;
if (g > 255) g = 255;
if (b > 255) b = 255;
if (r < 0) r = 0;
if (g < 0) g = 0;
if (b < 0) b = 0;
if (scale != 0) data[x][y].setColor(new Color(r, g, b));
else data[x][y].setColor(new Color(160,160,160));
// set border
if (data[x][y].getBinValue() > data[x][y].getOriginalValue()) {
data[x][y].setBorder(new LineBorder(getRom().getContainer().getSettings().getIncreaseBorder()));
} else if (data[x][y].getBinValue() < data[x][y].getOriginalValue()) {
data[x][y].setBorder(new LineBorder(getRom().getContainer().getSettings().getDecreaseBorder()));
} else {
data[x][y].setBorder(new LineBorder(Color.BLACK, 1));
}
}
}
}
xAxis.colorize();
yAxis.colorize();
}
// colorize borders
if (!isStatic) {
for (int x = 0; x < data.length; x++) {
for (int y = 0; y < data[0].length; y++) {
if (data[x][y].getBinValue() > data[x][y].getOriginalValue()) {
data[x][y].setBorder(new LineBorder(getRom().getContainer().getSettings().getIncreaseBorder()));
} else if (data[x][y].getBinValue() < data[x][y].getOriginalValue()) {
data[x][y].setBorder(new LineBorder(getRom().getContainer().getSettings().getDecreaseBorder()));
} else {
data[x][y].setBorder(new LineBorder(Color.BLACK, 1));
}
}
}
}
}
public void compare(int compareType) {
this.compareType = compareType;
for (int x = 0; x < data.length; x++) {
for (int y = 0; y < data[0].length; y++) {
if (compareType == this.COMPARE_ORIGINAL) data[x][y].setCompareValue(data[x][y].getOriginalValue());
data[x][y].setCompareType(compareType);
data[x][y].setCompareDisplay(compareDisplay);
data[x][y].updateDisplayValue();
}
}
colorize();
}
public void setFrame(TableFrame frame) {
this.frame = frame;
xAxis.setFrame(frame);
yAxis.setFrame(frame);
frame.setSize(getFrameSize());
}
public Dimension getFrameSize() {
int height = verticalOverhead + cellHeight * data[0].length;
int width = horizontalOverhead + data.length * cellWidth;
if (height < minHeight) height = minHeight;
if (width < minWidth) width = minWidth;
return new Dimension(width, height);
}
public String toString() {
return super.toString() + " (3D)";/* +
"\n Flip X: " + flipX +
"\n Size X: " + data.length +
"\n Flip Y: " + flipY +
"\n Size Y: " + data[0].length +
"\n Swap X/Y: " + swapXY +
xAxis +
yAxis;*/
}
public void increment(int increment) {
if (!isStatic) {
for (int x = 0; x < this.getSizeX(); x++) {
for (int y = 0; y < this.getSizeY(); y++) {
if (data[x][y].isSelected()) data[x][y].increment(increment);
}
}
}
xAxis.increment(increment);
yAxis.increment(increment);
}
public void clearSelection() {
xAxis.clearSelection(true);
yAxis.clearSelection(true);
for (int x = 0; x < this.getSizeX(); x++) {
for (int y = 0; y < this.getSizeY(); y++) {
data[x][y].setSelected(false);
}
}
}
public void highlight(int xCoord, int yCoord) {
if (highlight) {
for (int x = 0; x < this.getSizeX(); x++) {
for (int y = 0; y < this.getSizeY(); y++) {
if (((y >= highlightY && y <= yCoord) ||
(y <= highlightY && y >= yCoord)) &&
((x >= highlightX && x <= xCoord) ||
(x <= highlightX && x >= xCoord)) ) {
data[x][y].setHighlighted(true);
} else {
data[x][y].setHighlighted(false);
}
}
}
}
}
public void stopHighlight() {
highlight = false;
// loop through, selected and un-highlight
for (int x = 0; x < this.getSizeX(); x++) {
for (int y = 0; y < this.getSizeY(); y++) {
if (data[x][y].isHighlighted()) {
data[x][y].setSelected(true);
data[x][y].setHighlighted(false);
}
}
}
}
public void setRevertPoint() {
for (int x = 0; x < this.getSizeX(); x++) {
for (int y = 0; y < this.getSizeY(); y++) {
data[x][y].setOriginalValue(data[x][y].getBinValue());
}
}
yAxis.setRevertPoint();
xAxis.setRevertPoint();
colorize();
}
public void undoAll() {
for (int x = 0; x < this.getSizeX(); x++) {
for (int y = 0; y < this.getSizeY(); y++) {
data[x][y].setBinValue(data[x][y].getOriginalValue());
}
}
yAxis.undoAll();
xAxis.undoAll();
colorize();
}
public void undoSelected() {
for (int x = 0; x < this.getSizeX(); x++) {
for (int y = 0; y < this.getSizeY(); y++) {
if (data[x][y].isSelected()) data[x][y].setBinValue(data[x][y].getOriginalValue());
}
}
yAxis.undoSelected();
xAxis.undoSelected();
colorize();
}
public byte[] saveFile(byte[] binData) {
binData = xAxis.saveFile(binData);
binData = yAxis.saveFile(binData);
int offset = 0;
for (int x = 0; x < yAxis.getDataSize(); x++) {
for (int y = 0; y < xAxis.getDataSize(); y++) {
byte[] output = RomAttributeParser.parseIntegerValue(data[y][x].getBinValue(), endian, storageType);
for (int z = 0; z < storageType; z++) {
binData[offset * storageType + z + storageAddress - ramOffset] = output[z];
}
offset++;
}
}
return binData;
}
public void setRealValue(String realValue) {
if (!isStatic) {
for (int x = 0; x < this.getSizeX(); x++) {
for (int y = 0; y < this.getSizeY(); y++) {
if (data[x][y].isSelected()) data[x][y].setRealValue(realValue);
}
}
}
xAxis.setRealValue(realValue);
yAxis.setRealValue(realValue);
colorize();
}
public void addKeyListener(KeyListener listener) {
xAxis.addKeyListener(listener);
yAxis.addKeyListener(listener);
for (int x = 0; x < this.getSizeX(); x++) {
for (int y = 0; y < this.getSizeY(); y++) {
data[x][y].addKeyListener(listener);
}
}
}
public void selectCellAt(int y, Table1D axisType) {
if (axisType.getType() == TABLE_Y_AXIS) {
selectCellAt(0, y);
} else { // y axis
selectCellAt(y, 0);
}
}
public void selectCellAt(int x, int y) {
clearSelection();
data[x][y].setSelected(true);
highlightX = x;
highlightY = y;
}
public void cursorUp() {
if (highlightY > 0 && data[highlightX][highlightY].isSelected()) selectCellAt(highlightX, highlightY - 1);
else if (!xAxis.isStatic() && data[highlightX][highlightY].isSelected()) xAxis.selectCellAt(highlightX);
else {
xAxis.cursorUp();
yAxis.cursorUp();
}
}
public void cursorDown() {
if (highlightY < getSizeY() - 1 && data[highlightX][highlightY].isSelected()) selectCellAt(highlightX, highlightY + 1);
else {
xAxis.cursorDown();
yAxis.cursorDown();
}
}
public void cursorLeft() {
if (highlightX > 0 && data[highlightX][highlightY].isSelected()) selectCellAt(highlightX - 1, highlightY);
else if (!yAxis.isStatic() && data[highlightX][highlightY].isSelected()) yAxis.selectCellAt(highlightY);
else {
xAxis.cursorLeft();
yAxis.cursorLeft();
}
}
public void cursorRight() {
if (highlightX < getSizeX() - 1 && data[highlightX][highlightY].isSelected()) selectCellAt(highlightX + 1, highlightY);
else {
xAxis.cursorRight();
yAxis.cursorRight();
}
}
public void startHighlight(int x, int y) {
xAxis.clearSelection();
yAxis.clearSelection();
super.startHighlight(x, y);
}
public void copySelection() {
// find bounds of selection
// coords[0] = x min, y min, x max, y max
boolean copy = false;
int[] coords = new int[4];
coords[0] = this.getSizeX();
coords[1] = this.getSizeY();
for (int x = 0; x < this.getSizeX(); x++) {
for (int y = 0; y < this.getSizeY(); y++) {
if (data[x][y].isSelected()) {
if (x < coords[0]) {
coords[0] = x;
copy = true;
}
if (x > coords[2]) {
coords[2] = x;
copy = true;
}
if (y < coords[1]) {
coords[1] = y;
copy = true;
}
if (y > coords[3]) {
coords[3] = y;
copy = true;
}
}
}
}
// make string of selection
if (copy) {
String newline = System.getProperty("line.separator");
StringBuffer output = new StringBuffer("[Selection3D]" + newline);
for (int y = coords[1]; y <= coords[3]; y++) {
for (int x = coords[0]; x <= coords[2]; x++) {
if (data[x][y].isSelected()) output.append(data[x][y].getText());
else output.append("x"); // x represents non-selected cell
if (x < coords[2]) output.append("\t");
}
if (y < coords[3]) output.append(newline);
//copy to clipboard
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(output+""), null);
}
} else {
xAxis.copySelection();
yAxis.copySelection();
}
}
public void copyTable() {
// create string
String newline = System.getProperty("line.separator");
StringBuffer output = new StringBuffer("[Table3D]" + newline);
output.append(xAxis.getTableAsString() + newline);
for (int y = 0; y < getSizeY(); y++) {
output.append(yAxis.getCellAsString(y) + "\t");
for (int x = 0; x < getSizeX(); x++) {
output.append(data[x][y].getText());
if (x < getSizeX() - 1) output.append("\t");
}
if (y < getSizeY() - 1) output.append(newline);
}
//copy to clipboard
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(output+""), null);
}
public void paste() {
StringTokenizer st = new StringTokenizer("");
String input = "";
try {
input = (String)Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null).getTransferData(DataFlavor.stringFlavor);
st = new StringTokenizer(input);
} catch (UnsupportedFlavorException ex) { /* wrong paste type -- do nothing */
} catch (IOException ex) { }
String pasteType = st.nextToken();
if (pasteType.equalsIgnoreCase("[Table3D]")) { // Paste table
String newline = System.getProperty("line.separator");
String xAxisValues = "[Table1D]" + newline + st.nextToken(newline);
// build y axis and data values
StringBuffer yAxisValues = new StringBuffer("[Table1D]" + newline + st.nextToken("\t"));
StringBuffer dataValues = new StringBuffer("[Table3D]" + newline + st.nextToken("\t") + st.nextToken(newline));
while (st.hasMoreTokens()) {
yAxisValues.append("\t" + st.nextToken("\t"));
dataValues.append(newline + st.nextToken("\t") + st.nextToken(newline));
}
// put x axis in clipboard and paste
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(xAxisValues+""), null);
xAxis.paste();
// put y axis in clipboard and paste
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(yAxisValues+""), null);
yAxis.paste();
// put datavalues in clipboard and paste
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(dataValues+""), null);
pasteValues();
// reset clipboard
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(input+""), null);
} else if (pasteType.equalsIgnoreCase("[Selection3D]")) { // paste selection
pasteValues();
} else if (pasteType.equalsIgnoreCase("[Selection1D]")) { // paste selection
xAxis.paste();
yAxis.paste();
}
}
public void pasteCompare() {
StringTokenizer st = new StringTokenizer("");
String input = "";
try {
input = (String)Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null).getTransferData(DataFlavor.stringFlavor);
st = new StringTokenizer(input);
} catch (UnsupportedFlavorException ex) { /* wrong paste type -- do nothing */
} catch (IOException ex) { }
String pasteType = st.nextToken();
if (pasteType.equalsIgnoreCase("[Table3D]")) { // Paste table
String newline = System.getProperty("line.separator");
String xAxisValues = "[Table1D]" + newline + st.nextToken(newline);
// build y axis and data values
StringBuffer yAxisValues = new StringBuffer("[Table1D]" + newline + st.nextToken("\t"));
StringBuffer dataValues = new StringBuffer("[Table3D]" + newline + st.nextToken("\t") + st.nextToken(newline));
while (st.hasMoreTokens()) {
yAxisValues.append("\t" + st.nextToken("\t"));
dataValues.append(newline + st.nextToken("\t") + st.nextToken(newline));
}
// put x axis in clipboard and paste
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(xAxisValues+""), null);
xAxis.pasteCompare();
// put y axis in clipboard and paste
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(yAxisValues+""), null);
yAxis.pasteCompare();
// put datavalues in clipboard and paste
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(dataValues+""), null);
pasteCompareValues();
// reset clipboard
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(input+""), null);
}
colorize();
}
public void pasteValues() {
StringTokenizer st = new StringTokenizer("");
try {
String input = (String)Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null).getTransferData(DataFlavor.stringFlavor);
st = new StringTokenizer(input);
} catch (UnsupportedFlavorException ex) { /* wrong paste type -- do nothing */
} catch (IOException ex) { }
String pasteType = st.nextToken();
// figure paste start cell
int startX = 0;
int startY = 0;
// if pasting a table, startX and Y at 0, else highlight is start
if (pasteType.equalsIgnoreCase("[Selection3D]")) {
startX = highlightX;
startY = highlightY;
}
// set values
String newline = System.getProperty("line.separator");
for (int y = startY; y < getSizeY(); y++) {
if (st.hasMoreTokens()) {
StringTokenizer currentLine = new StringTokenizer(st.nextToken(newline));
for (int x = startX; x < getSizeX(); x++) {
if (currentLine.hasMoreTokens()) {
String currentToken = currentLine.nextToken();
boolean tableLarger = false;
try {
if (!data[x][y].getText().equalsIgnoreCase(currentToken)) {
data[x][y].setRealValue(currentToken);
}
} catch (ArrayIndexOutOfBoundsException ex) { /* copied table is larger than current table*/ }
}
}
}
}
}
public void pasteCompareValues() {
StringTokenizer st = new StringTokenizer("");
try {
String input = (String)Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null).getTransferData(DataFlavor.stringFlavor);
st = new StringTokenizer(input);
System.out.println(input);
} catch (UnsupportedFlavorException ex) { /* wrong paste type -- do nothing */
} catch (IOException ex) { }
String pasteType = st.nextToken();
// figure paste start cell
int startX = 0;
int startY = 0;
// set values
String newline = System.getProperty("line.separator");
for (int y = startY; y < getSizeY(); y++) {
if (st.hasMoreTokens()) {
StringTokenizer currentLine = new StringTokenizer(st.nextToken(newline));
for (int x = startX; x < getSizeX(); x++) {
if (currentLine.hasMoreTokens()) {
String currentToken = currentLine.nextToken();
boolean tableLarger = false;
try {
if (!data[x][y].getText().equalsIgnoreCase(currentToken)) {
data[x][y].setCompareRealValue(currentToken);
System.out.println(data[x][y].getCompareValue());
}
} catch (ArrayIndexOutOfBoundsException ex) { /* copied table is larger than current table*/ }
}
}
}
}
}
public void finalize(Settings settings) {
// apply settings to cells
for (int y = 0; y < getSizeY(); y++) {
for (int x = 0; x < getSizeX(); x++) {
this.setMaxColor(settings.getMaxColor());
this.setMinColor(settings.getMinColor());
data[x][y].setHighlightColor(settings.getHighlightColor());
data[x][y].setIncreaseBorder(settings.getIncreaseBorder());
data[x][y].setDecreaseBorder(settings.getDecreaseBorder());
data[x][y].setFont(settings.getTableFont());
data[x][y].repaint();
}
}
this.setAxisColor(settings.getAxisColor());
xAxis.finalize(settings);
yAxis.finalize(settings);
cellHeight = (int)settings.getCellSize().getHeight();
cellWidth = (int)settings.getCellSize().getWidth();
resize();
colorize();
}
public void setAxisColor(Color axisColor) {
xAxis.setAxisColor(axisColor);
yAxis.setAxisColor(axisColor);
}
public void validateScaling() {
super.validateScaling();
xAxis.validateScaling();
yAxis.validateScaling();
}
}

View File

@ -0,0 +1,53 @@
package enginuity.net;
import java.io.IOException;
public class BrowserControl {
public static void displayURL(String url) {
boolean windows = isWindowsPlatform();
String cmd = null;
try {
if (windows) {
// cmd = 'rundll32 url.dll,FileProtocolHandler http://...'
cmd = WIN_PATH + " " + WIN_FLAG + " " + url;
Process p = Runtime.getRuntime().exec(cmd);
}
else {
cmd = UNIX_PATH + " " + UNIX_FLAG + "(" + url + ")";
Process p = Runtime.getRuntime().exec(cmd);
try {
int exitCode = p.waitFor();
if (exitCode != 0)
{
cmd = UNIX_PATH + " " + url;
p = Runtime.getRuntime().exec(cmd);
}
}
catch(InterruptedException x) {
System.err.println("Error bringing up browser, cmd='" +
cmd + "'");
System.err.println("Caught: " + x);
}
}
}
catch(IOException x) {
// couldn't exec browser
System.err.println("Could not invoke browser, command=" + cmd);
System.err.println("Caught: " + x);
}
}
public static boolean isWindowsPlatform() {
String os = System.getProperty("os.name");
if ( os != null && os.startsWith(WIN_ID))
return true;
else
return false;
}
private static final String WIN_ID = "Windows";
private static final String WIN_PATH = "rundll32";
private static final String WIN_FLAG = "url.dll,FileProtocolHandler";
private static final String UNIX_PATH = "netscape";
private static final String UNIX_FLAG = "-remote openURL";
}

View File

@ -0,0 +1,41 @@
package enginuity.net;
import enginuity.net.BrowserControl;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JLabel;
public class URL extends JLabel implements MouseListener {
String url = "";
public URL(String url) {
super(url);
this.url = url;
this.setFont(new Font("Arial", Font.PLAIN, 12));
this.addMouseListener(this);
}
public void paint (Graphics g) {
super.paint(g);
Font f = getFont();
FontMetrics fm = getFontMetrics(f);
int x1 = 0;
int y1 = fm.getHeight() + 3;
int x2 = fm.stringWidth(getText());
if (getText().length() > 0)
g.drawLine(x1, y1, x2, y1);
}
public void mouseClicked(MouseEvent e) {
BrowserControl.displayURL(url);
}
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
}

View File

@ -0,0 +1,22 @@
package enginuity.swing;
import enginuity.maps.Rom;
import javax.swing.tree.DefaultMutableTreeNode;
public class CategoryTreeNode extends DefaultMutableTreeNode {
private Rom rom;
public CategoryTreeNode(String name, Rom rom) {
super(name);
this.setRom(rom);
}
public Rom getRom() {
return rom;
}
public void setRom(Rom rom) {
this.rom = rom;
}
}

View File

@ -0,0 +1,31 @@
package enginuity.swing;
import enginuity.net.URL;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class DebugPanel extends JPanel {
public DebugPanel(Exception ex, String url) {
setLayout(new BorderLayout());
JPanel top = new JPanel(new GridLayout(7, 1));
top.add(new JLabel("Enginuity has encountered an exception. Please review the details below."));
top.add(new JLabel("If you are unable to fix this problem please visit the following website"));
top.add(new JLabel("and provide these details and the steps that lead to this error."));
top.add(new JLabel());
top.add(new URL(url));
top.add(new JLabel());
top.add(new JLabel("Details:"));
add(top, BorderLayout.NORTH);
JTextArea output = new JTextArea(ex.getMessage());
add(output, BorderLayout.CENTER);
output.setAutoscrolls(true);
output.setRows(10);
output.setColumns(40);
}
}

View File

@ -0,0 +1,239 @@
package enginuity.swing;
import enginuity.xml.RomNotFoundException;
import enginuity.maps.Rom;
import enginuity.xml.DOMRomUnmarshaller;
import com.sun.org.apache.xerces.internal.parsers.DOMParser;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import javax.management.modelmbean.XMLParseException;
import javax.swing.JFileChooser;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JSeparator;
import enginuity.ECUEditor;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
public class ECUEditorMenuBar extends JMenuBar implements ActionListener {
private JMenu fileMenu = new JMenu("File");
private JMenuItem openImage = new JMenuItem("Open Image");
private JMenuItem saveImage = new JMenuItem("Save Image");
private JMenuItem refreshImage = new JMenuItem("Refresh Image");
private JMenuItem closeImage = new JMenuItem("Close Image");
private JMenuItem closeAll = new JMenuItem("Close All Images");
private JMenuItem exit = new JMenuItem("Exit");
private JMenu editMenu = new JMenu("Edit");
private JMenuItem settings = new JMenuItem("Settings");
private JMenu viewMenu = new JMenu("View");
private JMenuItem romProperties = new JMenuItem("ECU Image Properties");
private ECUEditor parent;
public ECUEditorMenuBar(ECUEditor parent) {
this.parent = parent;
add(fileMenu);
fileMenu.setMnemonic('F');
openImage.setMnemonic('O');
saveImage.setMnemonic('S');
refreshImage.setMnemonic('R');
closeImage.setMnemonic('C');
closeAll.setMnemonic('A');
exit.setMnemonic('X');
fileMenu.add(openImage);
fileMenu.add(saveImage);
fileMenu.add(refreshImage);
fileMenu.add(new JSeparator());
fileMenu.add(closeImage);
fileMenu.add(closeAll);
fileMenu.add(new JSeparator());
fileMenu.add(exit);
openImage.addActionListener(this);
saveImage.addActionListener(this);
refreshImage.addActionListener(this);
closeImage.addActionListener(this);
closeAll.addActionListener(this);
exit.addActionListener(this);
add(editMenu);
editMenu.setMnemonic('E');
settings.setMnemonic('S');
editMenu.add(new JSeparator());
editMenu.add(settings);
settings.addActionListener(this);
add(viewMenu);
viewMenu.setMnemonic('V');
romProperties.setMnemonic('P');
viewMenu.add(romProperties);
romProperties.addActionListener(this);
this.updateMenu();
}
public void updateMenu() {
String file = "";
try {
file = " " + parent.getLastSelectedRom().getFileName() + " ";
} catch (NullPointerException ex) { }
if (file.equals("")) {
saveImage.setEnabled(false);
closeImage.setEnabled(false);
closeAll.setEnabled(false);
romProperties.setEnabled(false);
} else {
saveImage.setEnabled(true);
closeImage.setEnabled(true);
closeAll.setEnabled(true);
romProperties.setEnabled(true);
}
saveImage.setText("Save" + file);
refreshImage.setText("Refresh" + file);
closeImage.setText("Close" + file);
romProperties.setText(file + "Properties");
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == openImage) {
try {
this.openImageDialog();
} catch (Exception ex) {
new JOptionPane().showMessageDialog(parent, new DebugPanel(ex,
parent.getSettings().getSupportURL()), "Exception", JOptionPane.ERROR_MESSAGE);
}
} else if (e.getSource() == saveImage) {
try {
this.saveImage(parent.getLastSelectedRom());
} catch (Exception ex) {
new JOptionPane().showMessageDialog(parent, new DebugPanel(ex,
parent.getSettings().getSupportURL()), "Exception", JOptionPane.ERROR_MESSAGE);
}
} else if (e.getSource() == closeImage) {
this.closeImage();
} else if (e.getSource() == closeAll) {
this.closeAllImages();
} else if (e.getSource() == exit) {
System.exit(0);
} else if (e.getSource() == romProperties) {
new JOptionPane().showMessageDialog(parent, (Object)(new RomPropertyPanel(parent.getLastSelectedRom())),
parent.getLastSelectedRom().getRomIDString() + " Properties", JOptionPane.INFORMATION_MESSAGE);
} else if (e.getSource() == refreshImage) {
try {
refreshImage();
throw new Exception();
} catch (Exception ex) {
new JOptionPane().showMessageDialog(parent, new DebugPanel(ex,
parent.getSettings().getSupportURL()), "Exception", JOptionPane.ERROR_MESSAGE);
}
} else if (e.getSource() == settings) {
SettingsForm form = new SettingsForm(parent);
form.setLocationRelativeTo(parent);
form.setVisible(true);
}
}
public void refreshImage() throws Exception {
File file = parent.getLastSelectedRom().getFullFileName();
parent.closeImage();
openImage(file);
}
public void closeImage() {
parent.closeImage();
}
public void closeAllImages() {
parent.closeAllImages();
}
public void saveImage(Rom input) throws XMLParseException, Exception {
if (parent.getLastSelectedRom() != null) {
JFileChooser fc = new JFileChooser(parent.getSettings().getLastImageDir());
fc.setFileFilter(new ECUImageFilter());
if (fc.showSaveDialog(parent) == fc.APPROVE_OPTION) {
boolean save = true;
if (fc.getSelectedFile().exists()) {
if (new JOptionPane().showConfirmDialog(parent, fc.getSelectedFile().getName() + " already exists! Overwrite?") == JOptionPane.CANCEL_OPTION) {
save = false;
}
}
if (save) {
byte[] output = parent.getLastSelectedRom().saveFile();
FileOutputStream fos = new FileOutputStream(fc.getSelectedFile());
fos.write(output);
fos.close();
fos = null;
parent.getLastSelectedRom().setFullFileName(fc.getSelectedFile().getAbsoluteFile());
parent.setLastSelectedRom(parent.getLastSelectedRom());
}
}
}
}
public void openImageDialog() throws XMLParseException, Exception {
JFileChooser fc = new JFileChooser(parent.getSettings().getLastImageDir());
fc.setFileFilter(new ECUImageFilter());
if (fc.showOpenDialog(parent) == fc.APPROVE_OPTION) {
openImage(fc.getSelectedFile());
parent.getSettings().setLastImageDir(fc.getCurrentDirectory());
}
}
public void openImage(File inputFile) throws XMLParseException, Exception {
try {
parent.repaintPanel();
JProgressPane progress = new JProgressPane(parent, "Opening file...", "Parsing ECU definitions...");
progress.update("Parsing ECU definitions...", 0);
InputSource src = new InputSource(new FileInputStream(parent.getSettings().getEcuDefinitionFile()));
DOMRomUnmarshaller domUms = new DOMRomUnmarshaller();
DOMParser parser = new DOMParser();
parser.parse(src);
Document doc = parser.getDocument();
FileInputStream fis = new FileInputStream(inputFile);
byte[] input = new byte[fis.available()];
fis.read(input);
fis.close();
progress.update("Finding ECU definition...", 10);
Rom rom = domUms.unmarshallXMLDefinition(doc.getDocumentElement(), input, progress);
progress.update("Populating tables...", 50);
rom.populateTables(input, progress);
rom.setFileName(inputFile.getName());
progress.update("Finalizing...", 90);
parent.addRom(rom);
rom.setFullFileName(inputFile);
progress.dispose();
} catch (RomNotFoundException ex) {
new JOptionPane().showMessageDialog(parent, "ECU Definition Not Found", "Error Loading " + inputFile.getName(), JOptionPane.ERROR_MESSAGE);
} catch (StackOverflowError ex) {
new JOptionPane().showMessageDialog(parent, "Looped \"base\" attribute in XML definitions.", "Error Loading ROM", JOptionPane.ERROR_MESSAGE);
}
}
}

View File

@ -0,0 +1,99 @@
package enginuity.swing;
import enginuity.swing.DebugPanel;
import enginuity.swing.ECUEditorMenuBar;
import enginuity.ECUEditor;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.management.modelmbean.XMLParseException;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JToolBar;
import javax.swing.border.LineBorder;
public class ECUEditorToolBar extends JToolBar implements ActionListener {
private ECUEditor parent;
private JButton openImage = new JButton(new ImageIcon("./graphics/icon-open.png"));
private JButton saveImage = new JButton(new ImageIcon("./graphics/icon-save.png"));
private JButton refreshImage = new JButton(new ImageIcon("./graphics/icon-refresh.png"));
private JButton closeImage = new JButton(new ImageIcon("./graphics/icon-close.png"));
public ECUEditorToolBar(ECUEditor parent) {
super();
this.parent = parent;
this.setFloatable(false);
this.add(openImage);
this.add(saveImage);
this.add(closeImage);
this.add(refreshImage);
openImage.setMaximumSize(new Dimension(58,50));
openImage.setBorder(new LineBorder(new Color(150,150,150), 1));
saveImage.setMaximumSize(new Dimension(50,50));
saveImage.setBorder(new LineBorder(new Color(150,150,150), 1));
closeImage.setMaximumSize(new Dimension(50,50));
closeImage.setBorder(new LineBorder(new Color(150,150,150), 1));
refreshImage.setMaximumSize(new Dimension(50,50));
refreshImage.setBorder(new LineBorder(new Color(150,150,150), 1));
updateButtons();
openImage.addActionListener(this);
saveImage.addActionListener(this);
closeImage.addActionListener(this);
refreshImage.addActionListener(this);
}
public void updateButtons() {
String file = "";
try {
file = " " + parent.getLastSelectedRom().getFileName();
} catch (NullPointerException ex) { }
openImage.setToolTipText("Open Image");
saveImage.setToolTipText("Save" + file);
refreshImage.setToolTipText("Refresh" + file + " from saved copy");
closeImage.setToolTipText("Close" + file);
if (file.equals("")) {
saveImage.setEnabled(false);
refreshImage.setEnabled(false);
closeImage.setEnabled(false);
} else {
saveImage.setEnabled(true);
refreshImage.setEnabled(true);
closeImage.setEnabled(true);
}
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == openImage) {
try {
((ECUEditorMenuBar)parent.getJMenuBar()).openImageDialog();
} catch (Exception ex) {
new JOptionPane().showMessageDialog(parent, new DebugPanel(ex,
parent.getSettings().getSupportURL()), "Exception", JOptionPane.ERROR_MESSAGE);
}
} else if (e.getSource() == saveImage) {
try {
((ECUEditorMenuBar)parent.getJMenuBar()).saveImage(parent.getLastSelectedRom());
} catch (Exception ex) {
new JOptionPane().showMessageDialog(parent, new DebugPanel(ex,
parent.getSettings().getSupportURL()), "Exception", JOptionPane.ERROR_MESSAGE);
}
} else if (e.getSource() == closeImage) {
((ECUEditorMenuBar)parent.getJMenuBar()).closeImage();
} else if (e.getSource() == refreshImage) {
try {
((ECUEditorMenuBar)parent.getJMenuBar()).refreshImage();
} catch (Exception ex) {
new JOptionPane().showMessageDialog(parent, new DebugPanel(ex,
parent.getSettings().getSupportURL()), "Exception", JOptionPane.ERROR_MESSAGE);
}
}
}
}

View File

@ -0,0 +1,91 @@
package enginuity.swing;
import java.io.File;
import java.util.Hashtable;
import java.util.Enumeration;
import javax.swing.*;
import javax.swing.filechooser.*;
public class ECUImageFilter extends FileFilter {
private static String TYPE_UNKNOWN = "Type Unknown";
private static String HIDDEN_FILE = "Hidden File";
private Hashtable filters = null;
private String description = null;
private String fullDescription = null;
private boolean useExtensionsInDescription = true;
public ECUImageFilter() {
this.filters = new Hashtable();
this.addExtension("bin");
this.addExtension("hex");
this.setDescription("ECU Image Files");
}
public boolean accept(File f) {
if(f != null) {
if(f.isDirectory()) {
return true;
}
String extension = getExtension(f);
if(extension != null && filters.get(getExtension(f)) != null) {
return true;
};
}
return false;
}
public String getExtension(File f) {
if(f != null) {
String filename = f.getName();
int i = filename.lastIndexOf('.');
if(i>0 && i<filename.length()-1) {
return filename.substring(i+1).toLowerCase();
};
}
return null;
}
public void addExtension(String extension) {
if(filters == null) {
filters = new Hashtable(5);
}
filters.put(extension.toLowerCase(), this);
fullDescription = null;
}
public String getDescription() {
if(fullDescription == null) {
if(description == null || isExtensionListInDescription()) {
fullDescription = description==null ? "(" : description + " (";
// build the description from the extension list
Enumeration extensions = filters.keys();
if(extensions != null) {
fullDescription += "." + (String) extensions.nextElement();
while (extensions.hasMoreElements()) {
fullDescription += ", ." + (String) extensions.nextElement();
}
}
fullDescription += ")";
} else {
fullDescription = description;
}
}
return fullDescription;
}
public void setDescription(String description) {
this.description = description;
fullDescription = null;
}
public void setExtensionListInDescription(boolean b) {
useExtensionsInDescription = b;
fullDescription = null;
}
public boolean isExtensionListInDescription() {
return useExtensionsInDescription;
}
}

View File

@ -0,0 +1,43 @@
package enginuity.swing;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.border.LineBorder;
public class JProgressPane extends JFrame {
JLabel label = new JLabel();
JProgressBar progressBar = new JProgressBar(JProgressBar.HORIZONTAL, 0, 100);
public JProgressPane(Component component, String title, String status) {
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(2, 1));
label.setHorizontalAlignment(label.CENTER);
label.setText(status);
panel.add(label);
panel.add(progressBar);
panel.setBorder(new LineBorder(getBackground(), 12));
setSize(400,60);
setLocationRelativeTo(component);
setTitle(title);
setUndecorated(true);
getContentPane().add(panel);
setVisible(true);
requestFocus();
}
public void update(String status, int percent) {
label.setText(status);
progressBar.setValue(percent);
update(getGraphics());
requestFocus();
}
}

View File

@ -0,0 +1,66 @@
package enginuity.swing;
import enginuity.maps.Rom;
import enginuity.maps.Table;
import java.awt.Component;
import java.awt.Dimension;
import java.util.Vector;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
public class JTableChooser extends JOptionPane {
JPanel displayPanel = new JPanel();
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Roms");
JTree displayTree = new JTree(rootNode);
public boolean showChooser(Vector<Rom> roms, Component parent, Table targetTable) {
for (int i = 0; i < roms.size(); i++) {
Rom rom = roms.get(i);
DefaultMutableTreeNode romNode = new DefaultMutableTreeNode(rom.getFileName());
rootNode.add(romNode);
for (int j = 0; j < rom.getTables().size(); j++) {
Table table = rom.getTables().get(j);
TableChooserTreeNode tableNode = new TableChooserTreeNode(table.getName(), table);
// categories
boolean categoryExists = false;
for (int k = 0; k < romNode.getChildCount(); k++) {
if (romNode.getChildAt(k).toString().equalsIgnoreCase(table.getCategory())) {
((DefaultMutableTreeNode)romNode.getChildAt(k)).add(tableNode);
categoryExists = true;
break;
}
}
if (!categoryExists) {
DefaultMutableTreeNode categoryNode = new DefaultMutableTreeNode(table.getCategory());
romNode.add(categoryNode);
categoryNode.add(tableNode);
}
}
}
displayPanel.setPreferredSize(new Dimension(350, 400));
displayTree.setMinimumSize(new Dimension(330, 400));
displayTree.setRootVisible(false);
displayTree.updateUI();
displayPanel.add(new JScrollPane(displayTree));
Object[] values = { "Compare", "Cancel" };
if ((showOptionDialog(parent, displayPanel, "Select a Map", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, values, values[0]) == 0 &&
(displayTree.getLastSelectedPathComponent() instanceof TableChooserTreeNode))) {
((TableChooserTreeNode)displayTree.getLastSelectedPathComponent()).getTable().copyTable();
return true;
} else {
return false;
}
}
}

View File

@ -0,0 +1,210 @@
package enginuity.swing;
import enginuity.swing.MDIDesktopPane;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
/**
* An extension of WDesktopPane that supports often used MDI functionality. This
* class also handles setting scroll bars for when windows move too far to the left or
* bottom, providing the MDIDesktopPane is in a ScrollPane.
*/
public class MDIDesktopPane extends JDesktopPane {
private static int FRAME_OFFSET=20;
private MDIDesktopManager manager;
public MDIDesktopPane() {
manager=new MDIDesktopManager(this);
setDesktopManager(manager);
setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
}
public void setBounds(int x, int y, int w, int h) {
super.setBounds(x,y,w,h);
checkDesktopSize();
}
public Component add(JInternalFrame frame) {
JInternalFrame[] array = getAllFrames();
Point p;
int w;
int h;
Component retval=super.add(frame);
checkDesktopSize();
if (array.length > 0) {
p = array[0].getLocation();
p.x = p.x + FRAME_OFFSET;
p.y = p.y + FRAME_OFFSET;
}
else {
p = new Point(0, 0);
}
frame.setLocation(p.x, p.y);
if (frame.isResizable()) {
w = getWidth() - (getWidth()/3);
h = getHeight() - (getHeight()/3);
if (w < frame.getMinimumSize().getWidth()) w = (int)frame.getMinimumSize().getWidth();
if (h < frame.getMinimumSize().getHeight()) h = (int)frame.getMinimumSize().getHeight();
frame.setSize(w, h);
}
moveToFront(frame);
frame.setVisible(true);
try {
frame.setSelected(true);
} catch (PropertyVetoException e) {
frame.toBack();
}
return retval;
}
public void remove(Component c) {
super.remove(c);
checkDesktopSize();
}
/**
* Cascade all internal frames
*/
public void cascadeFrames() {
int x = 0;
int y = 0;
JInternalFrame allFrames[] = getAllFrames();
manager.setNormalSize();
int frameHeight = (getBounds().height - 5) - allFrames.length * FRAME_OFFSET;
int frameWidth = (getBounds().width - 5) - allFrames.length * FRAME_OFFSET;
for (int i = allFrames.length - 1; i >= 0; i--) {
allFrames[i].setSize(frameWidth,frameHeight);
allFrames[i].setLocation(x,y);
x = x + FRAME_OFFSET;
y = y + FRAME_OFFSET;
}
}
/**
* Tile all internal frames
*/
public void tileFrames() {
java.awt.Component allFrames[] = getAllFrames();
manager.setNormalSize();
int frameHeight = getBounds().height/allFrames.length;
int y = 0;
for (int i = 0; i < allFrames.length; i++) {
allFrames[i].setSize(getBounds().width,frameHeight);
allFrames[i].setLocation(0,y);
y = y + frameHeight;
}
}
/**
* Sets all component size properties ( maximum, minimum, preferred)
* to the given dimension.
*/
public void setAllSize(Dimension d){
setMinimumSize(d);
setMaximumSize(d);
setPreferredSize(d);
}
/**
* Sets all component size properties ( maximum, minimum, preferred)
* to the given width and height.
*/
public void setAllSize(int width, int height){
setAllSize(new Dimension(width,height));
}
private void checkDesktopSize() {
if (getParent()!=null&&isVisible()) manager.resizeDesktop();
}
}
/**
* Private class used to replace the standard DesktopManager for JDesktopPane.
* Used to provide scrollbar functionality.
*/
class MDIDesktopManager extends DefaultDesktopManager {
private MDIDesktopPane desktop;
public MDIDesktopManager(MDIDesktopPane desktop) {
this.desktop = desktop;
}
public void endResizingFrame(JComponent f) {
super.endResizingFrame(f);
resizeDesktop();
}
public void endDraggingFrame(JComponent f) {
super.endDraggingFrame(f);
resizeDesktop();
}
public void setNormalSize() {
JScrollPane scrollPane=getScrollPane();
int x = 0;
int y = 0;
Insets scrollInsets = getScrollPaneInsets();
if (scrollPane != null) {
Dimension d = scrollPane.getVisibleRect().getSize();
if (scrollPane.getBorder() != null) {
d.setSize(d.getWidth() - scrollInsets.left - scrollInsets.right,
d.getHeight() - scrollInsets.top - scrollInsets.bottom);
}
d.setSize(d.getWidth() - 20, d.getHeight() - 20);
desktop.setAllSize(x,y);
scrollPane.invalidate();
scrollPane.validate();
}
}
private Insets getScrollPaneInsets() {
JScrollPane scrollPane=getScrollPane();
if (scrollPane==null) return new Insets(0,0,0,0);
else return getScrollPane().getBorder().getBorderInsets(scrollPane);
}
private JScrollPane getScrollPane() {
if (desktop.getParent() instanceof JViewport) {
JViewport viewPort = (JViewport)desktop.getParent();
if (viewPort.getParent() instanceof JScrollPane)
return (JScrollPane)viewPort.getParent();
}
return null;
}
protected void resizeDesktop() {
int x = 0;
int y = 0;
JScrollPane scrollPane = getScrollPane();
Insets scrollInsets = getScrollPaneInsets();
if (scrollPane != null) {
JInternalFrame allFrames[] = desktop.getAllFrames();
for (int i = 0; i < allFrames.length; i++) {
if (allFrames[i].getX()+allFrames[i].getWidth()>x) {
x = allFrames[i].getX() + allFrames[i].getWidth();
}
if (allFrames[i].getY()+allFrames[i].getHeight()>y) {
y = allFrames[i].getY() + allFrames[i].getHeight();
}
}
Dimension d=scrollPane.getVisibleRect().getSize();
if (scrollPane.getBorder() != null) {
d.setSize(d.getWidth() - scrollInsets.left - scrollInsets.right,
d.getHeight() - scrollInsets.top - scrollInsets.bottom);
}
if (x <= d.getWidth()) x = ((int)d.getWidth()) - 20;
if (y <= d.getHeight()) y = ((int)d.getHeight()) - 20;
desktop.setAllSize(x,y);
scrollPane.invalidate();
scrollPane.validate();
}
}
}

View File

@ -0,0 +1,307 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.3" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<AuxValues>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
</AuxValues>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Component id="lblFilename" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="fileName" min="-2" pref="302" max="-2" attributes="0"/>
</Group>
<Group type="102" alignment="0" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="lblECURevision" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="lblEcuVersion" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="lblFilesize" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="fileSize" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="ecuVersion" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="xmlID" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<Group type="102" alignment="0" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="lblYear" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="lblModel" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="lblSubmodel" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="lblTransmission" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="lblMarket" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="lblMake" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="-2" pref="7" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="make" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="market" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="year" min="-2" max="-2" attributes="0"/>
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="transmission" min="-2" max="-2" attributes="0"/>
<Component id="submodel" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<Component id="model" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
</Group>
<EmptySpace min="-2" pref="32" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="lblInternalId" min="-2" max="-2" attributes="0"/>
<Component id="lblStorageAddress" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace pref="53" max="32767" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="internalID" min="-2" max="-2" attributes="0"/>
<Component id="storageAddress" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="-2" pref="36" max="-2" attributes="0"/>
</Group>
<Component id="lblTables" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="jScrollPane1" alignment="0" min="-2" pref="226" max="-2" attributes="0"/>
</Group>
</Group>
</Group>
<EmptySpace min="-2" max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="1" attributes="0">
<EmptySpace min="-2" pref="21" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="103" alignment="0" groupAlignment="3" attributes="0">
<Component id="lblFilename" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="fileName" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="40" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblECURevision" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="xmlID" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="lblInternalId" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="internalID" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="ecuVersion" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="lblEcuVersion" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="storageAddress" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="lblStorageAddress" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblFilesize" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="fileSize" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Component id="lblTables" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblMake" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="make" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblMarket" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="market" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblYear" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="year" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblModel" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="model" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblSubmodel" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="submodel" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblTransmission" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="transmission" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<Component id="jScrollPane1" min="0" pref="0" max="32767" attributes="1"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Component class="javax.swing.JLabel" name="lblFilename">
<Properties>
<Property name="text" type="java.lang.String" value="Filename:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="fileName">
<Properties>
<Property name="text" type="java.lang.String" value="Filename"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblECURevision">
<Properties>
<Property name="text" type="java.lang.String" value="ECU Revision:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="xmlID">
<Properties>
<Property name="text" type="java.lang.String" value="XMLID"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblFilesize">
<Properties>
<Property name="text" type="java.lang.String" value="Filesize:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="fileSize">
<Properties>
<Property name="text" type="java.lang.String" value="999kb"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblEcuVersion">
<Properties>
<Property name="text" type="java.lang.String" value="ECU Version:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="ecuVersion">
<Properties>
<Property name="text" type="java.lang.String" value="ECUVER"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblInternalId">
<Properties>
<Property name="text" type="java.lang.String" value="Internal ID:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="internalID">
<Properties>
<Property name="text" type="java.lang.String" value="INTERNAL"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblStorageAddress">
<Properties>
<Property name="text" type="java.lang.String" value="ID Storage Address:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="storageAddress">
<Properties>
<Property name="text" type="java.lang.String" value="0x00"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblMake">
<Properties>
<Property name="text" type="java.lang.String" value="Make:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblMarket">
<Properties>
<Property name="text" type="java.lang.String" value="Market:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblTransmission">
<Properties>
<Property name="text" type="java.lang.String" value="Transmission:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblModel">
<Properties>
<Property name="text" type="java.lang.String" value="Model:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblSubmodel">
<Properties>
<Property name="text" type="java.lang.String" value="Submodel:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblYear">
<Properties>
<Property name="text" type="java.lang.String" value="Year:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="make">
<Properties>
<Property name="text" type="java.lang.String" value="Make"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="market">
<Properties>
<Property name="text" type="java.lang.String" value="Market"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="year">
<Properties>
<Property name="text" type="java.lang.String" value="Year"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="model">
<Properties>
<Property name="text" type="java.lang.String" value="Model"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="submodel">
<Properties>
<Property name="text" type="java.lang.String" value="Submodel"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="transmission">
<Properties>
<Property name="text" type="java.lang.String" value="Transmission"/>
</Properties>
</Component>
<Container class="javax.swing.JScrollPane" name="jScrollPane1">
<AuxValues>
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Component class="javax.swing.JList" name="tableList">
<Properties>
<Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.editors2.ListModelEditor">
<StringArray count="5">
<StringItem index="0" value="Item 1"/>
<StringItem index="1" value="Item 2"/>
<StringItem index="2" value="Item 3"/>
<StringItem index="3" value="Item 4"/>
<StringItem index="4" value="Item 5"/>
</StringArray>
</Property>
</Properties>
</Component>
</SubComponents>
</Container>
<Component class="javax.swing.JLabel" name="lblTables">
<Properties>
<Property name="text" type="java.lang.String" value="Tables:"/>
</Properties>
</Component>
</SubComponents>
</Form>

View File

@ -0,0 +1,264 @@
package enginuity.swing;
import enginuity.maps.Rom;
public class RomPropertyPanel extends javax.swing.JPanel {
Rom rom = new Rom();
public RomPropertyPanel(Rom rom) {
initComponents();
// populate fields
fileName.setText(rom.getFileName());
xmlID.setText(rom.getRomID().getXmlid());
ecuVersion.setText(rom.getRomID().getCaseId());
fileSize.setText((rom.getRealFileSize() / 1024) + "kb");
internalID.setText(rom.getRomID().getInternalIdString());
storageAddress.setText("0x" + Integer.toHexString(rom.getRomID().getInternalIdAddress()));
make.setText(rom.getRomID().getMake());
market.setText(rom.getRomID().getMarket());
year.setText(rom.getRomID().getYear()+"");
model.setText(rom.getRomID().getModel());
submodel.setText(rom.getRomID().getSubModel());
transmission.setText(rom.getRomID().getTransmission());
tableList.setListData(rom.getTables());
}
//prevent bad constructor
private RomPropertyPanel() { }
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
private void initComponents() {
lblFilename = new javax.swing.JLabel();
fileName = new javax.swing.JLabel();
lblECURevision = new javax.swing.JLabel();
xmlID = new javax.swing.JLabel();
lblFilesize = new javax.swing.JLabel();
fileSize = new javax.swing.JLabel();
lblEcuVersion = new javax.swing.JLabel();
ecuVersion = new javax.swing.JLabel();
lblInternalId = new javax.swing.JLabel();
internalID = new javax.swing.JLabel();
lblStorageAddress = new javax.swing.JLabel();
storageAddress = new javax.swing.JLabel();
lblMake = new javax.swing.JLabel();
lblMarket = new javax.swing.JLabel();
lblTransmission = new javax.swing.JLabel();
lblModel = new javax.swing.JLabel();
lblSubmodel = new javax.swing.JLabel();
lblYear = new javax.swing.JLabel();
make = new javax.swing.JLabel();
market = new javax.swing.JLabel();
year = new javax.swing.JLabel();
model = new javax.swing.JLabel();
submodel = new javax.swing.JLabel();
transmission = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
tableList = new javax.swing.JList();
lblTables = new javax.swing.JLabel();
lblFilename.setText("Filename:");
fileName.setText("Filename");
lblECURevision.setText("ECU Revision:");
xmlID.setText("XMLID");
lblFilesize.setText("Filesize:");
fileSize.setText("999kb");
lblEcuVersion.setText("ECU Version:");
ecuVersion.setText("ECUVER");
lblInternalId.setText("Internal ID:");
internalID.setText("INTERNAL");
lblStorageAddress.setText("ID Storage Address:");
storageAddress.setText("0x00");
lblMake.setText("Make:");
lblMarket.setText("Market:");
lblTransmission.setText("Transmission:");
lblModel.setText("Model:");
lblSubmodel.setText("Submodel:");
lblYear.setText("Year:");
make.setText("Make");
market.setText("Market");
year.setText("Year");
model.setText("Model");
submodel.setText("Submodel");
transmission.setText("Transmission");
tableList.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]; }
});
jScrollPane1.setViewportView(tableList);
lblTables.setText("Tables:");
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(lblFilename)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(fileName, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 302, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(lblECURevision)
.add(lblEcuVersion)
.add(lblFilesize))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(fileSize)
.add(ecuVersion)
.add(xmlID)))
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(lblYear)
.add(lblModel)
.add(lblSubmodel)
.add(lblTransmission)
.add(lblMarket)
.add(lblMake))
.add(7, 7, 7)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(make)
.add(market)
.add(year)
.add(layout.createSequentialGroup()
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(transmission)
.add(submodel)))
.add(model))))
.add(32, 32, 32)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(lblInternalId)
.add(lblStorageAddress))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 53, Short.MAX_VALUE)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(internalID)
.add(storageAddress))
.add(36, 36, 36))
.add(lblTables)
.add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 226, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
.add(21, 21, 21)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblFilename)
.add(fileName))
.add(layout.createSequentialGroup()
.add(40, 40, 40)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblECURevision)
.add(xmlID)
.add(lblInternalId)
.add(internalID))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(ecuVersion)
.add(lblEcuVersion)
.add(storageAddress)
.add(lblStorageAddress))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblFilesize)
.add(fileSize))))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(lblTables)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblMake)
.add(make))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblMarket)
.add(market))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblYear)
.add(year))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblModel)
.add(model))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblSubmodel)
.add(submodel))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblTransmission)
.add(transmission)))
.add(jScrollPane1, 0, 0, Short.MAX_VALUE))
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel ecuVersion;
private javax.swing.JLabel fileName;
private javax.swing.JLabel fileSize;
private javax.swing.JLabel internalID;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JLabel lblECURevision;
private javax.swing.JLabel lblEcuVersion;
private javax.swing.JLabel lblFilename;
private javax.swing.JLabel lblFilesize;
private javax.swing.JLabel lblInternalId;
private javax.swing.JLabel lblMake;
private javax.swing.JLabel lblMarket;
private javax.swing.JLabel lblModel;
private javax.swing.JLabel lblStorageAddress;
private javax.swing.JLabel lblSubmodel;
private javax.swing.JLabel lblTables;
private javax.swing.JLabel lblTransmission;
private javax.swing.JLabel lblYear;
private javax.swing.JLabel make;
private javax.swing.JLabel market;
private javax.swing.JLabel model;
private javax.swing.JLabel storageAddress;
private javax.swing.JLabel submodel;
private javax.swing.JList tableList;
private javax.swing.JLabel transmission;
private javax.swing.JLabel xmlID;
private javax.swing.JLabel year;
// End of variables declaration//GEN-END:variables
}

View File

@ -0,0 +1,55 @@
package enginuity.swing;
import enginuity.ECUEditor;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
public class RomTree extends JTree implements MouseListener {
private ECUEditor container;
public RomTree (DefaultMutableTreeNode input) {
super(input);
this.setRootVisible(false);
this.addMouseListener(this);
}
public ECUEditor getContainer() {
return container;
}
public void setContainer(ECUEditor container) {
this.container = container;
}
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
try {
TableTreeNode node = (TableTreeNode)this.getLastSelectedPathComponent();
container.displayTable(node.getFrame());
} catch (ClassCastException ex) {
} catch (NullPointerException ex) { }
} if (e.getClickCount() == 1) {
if (getLastSelectedPathComponent() instanceof TableTreeNode) {
TableTreeNode node = (TableTreeNode)this.getLastSelectedPathComponent();
container.setLastSelectedRom(node.getTable().getRom());
} else if (getLastSelectedPathComponent() instanceof CategoryTreeNode) {
CategoryTreeNode node = (CategoryTreeNode)this.getLastSelectedPathComponent();
container.setLastSelectedRom(node.getRom());
} else if (getLastSelectedPathComponent() instanceof RomTreeNode) {
RomTreeNode node = (RomTreeNode)this.getLastSelectedPathComponent();
container.setLastSelectedRom(node.getRom());
}
}
}
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
}

View File

@ -0,0 +1,59 @@
package enginuity.swing;
import enginuity.maps.Rom;
import enginuity.maps.Table;
import javax.swing.tree.DefaultMutableTreeNode;
public class RomTreeNode extends DefaultMutableTreeNode {
private Rom rom = new Rom();
public RomTreeNode(Rom rom) {
super(rom.getFileName());
this.setRom(rom);
}
public void updateFileName() {
this.setUserObject(rom.getFileName());
}
public void add(Table table) {
boolean categoryExists = false;
for (int i = 0; i < this.getChildCount(); i++) {
if (this.getChildAt(i).toString().equals(table.getCategory())) {
TableFrame frame = new TableFrame(table);
table.setFrame(frame);
TableTreeNode tableNode = new TableTreeNode(table);
this.getChildAt(i).add(tableNode);
categoryExists = true;
break;
}
}
if (!categoryExists) {
this.add(new CategoryTreeNode(table.getCategory(), table.getRom()));
TableFrame frame = new TableFrame(table);
table.setFrame(frame);
TableTreeNode tableNode = new TableTreeNode(table);
this.getLastChild().add(tableNode);
}
}
public DefaultMutableTreeNode getChildAt(int i) {
return (DefaultMutableTreeNode)super.getChildAt(i);
}
public DefaultMutableTreeNode getLastChild() {
return (DefaultMutableTreeNode)super.getLastChild();
}
public Rom getRom() {
return rom;
}
public void setRom(Rom rom) {
this.rom = rom;
}
}

View File

@ -0,0 +1,464 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.3" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
<Properties>
<Property name="defaultCloseOperation" type="int" value="2"/>
<Property name="title" type="java.lang.String" value="Enginuity Settings"/>
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
<Color id="Default Cursor"/>
</Property>
</Properties>
<SyntheticProperties>
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
</SyntheticProperties>
<AuxValues>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
</AuxValues>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="lblEcuDef" alignment="0" min="-2" max="-2" attributes="0"/>
<Group type="102" alignment="0" attributes="0">
<Component id="ecuDefinitionFile" min="-2" pref="257" max="-2" attributes="2"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="btnEcuDefinitionBrowse" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
</Group>
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="calcConflictWarning" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="obsoleteWarning" min="-2" max="-2" attributes="1"/>
<Component id="singleTableView" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="debug" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="103" alignment="0" groupAlignment="1" attributes="0">
<Component id="lblAxis" alignment="1" min="-2" max="-2" attributes="0"/>
<Component id="lblHighlight" alignment="1" min="-2" max="-2" attributes="0"/>
<Component id="lblMin" alignment="1" min="-2" max="-2" attributes="0"/>
</Group>
<Component id="lblMax" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="maxColor" alignment="1" min="-2" pref="50" max="-2" attributes="0"/>
<Component id="minColor" alignment="1" min="-2" pref="50" max="-2" attributes="0"/>
<Component id="highlightColor" alignment="1" min="-2" pref="50" max="-2" attributes="0"/>
<Component id="axisColor" alignment="1" min="-2" pref="50" max="-2" attributes="0"/>
</Group>
</Group>
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="53" max="-2" attributes="0"/>
<Component id="lblCellSize" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace min="-2" pref="57" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="lblDecrease" alignment="0" min="-2" max="-2" attributes="0"/>
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="3" pref="3" max="3" attributes="0"/>
<Component id="lblIncrease" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="increaseColor" alignment="0" min="-2" pref="50" max="-2" attributes="0"/>
<Component id="decreaseColor" alignment="0" min="-2" pref="50" max="-2" attributes="0"/>
</Group>
</Group>
<Group type="102" alignment="0" attributes="1">
<EmptySpace min="47" pref="47" max="47" attributes="0"/>
<Component id="lblBorders" min="-2" max="-2" attributes="0"/>
</Group>
<Component id="btnChooseFont" alignment="0" pref="140" max="32767" attributes="0"/>
</Group>
</Group>
<Group type="102" alignment="1" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="lblFont" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="65" max="-2" attributes="0"/>
</Group>
</Group>
</Group>
<Group type="102" alignment="0" attributes="1">
<EmptySpace min="-2" pref="47" max="-2" attributes="0"/>
<Component id="lblBackgrounds" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
</Group>
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="20" max="-2" attributes="0"/>
<Group type="103" groupAlignment="1" attributes="0">
<Component id="lblCellWidth" alignment="1" min="-2" max="-2" attributes="0"/>
<Component id="lblCellHeight" alignment="1" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="1" attributes="0">
<Group type="102" alignment="1" attributes="0">
<EmptySpace min="10" pref="10" max="10" attributes="0"/>
<Component id="cellWidth" min="-2" pref="50" max="-2" attributes="0"/>
</Group>
<Component id="cellHeight" min="-2" pref="50" max="-2" attributes="0"/>
</Group>
</Group>
<Group type="102" alignment="1" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="reset" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="34" max="32767" attributes="0"/>
<Component id="btnApply" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="btnOk" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="btnCancel" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<EmptySpace max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="lblEcuDef" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="btnEcuDefinitionBrowse" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="ecuDefinitionFile" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="-2" pref="27" max="-2" attributes="0"/>
<Component id="obsoleteWarning" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="calcConflictWarning" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="singleTableView" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="debug" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="31" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Component id="lblBorders" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="increaseColor" alignment="3" min="-2" pref="15" max="-2" attributes="0"/>
<Component id="lblIncrease" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblDecrease" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="decreaseColor" alignment="3" min="-2" pref="15" max="-2" attributes="0"/>
</Group>
</Group>
<Group type="102" alignment="0" attributes="0">
<Component id="lblBackgrounds" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblMax" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="maxColor" alignment="3" min="-2" pref="15" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblMin" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="minColor" alignment="3" min="-2" pref="15" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblHighlight" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="highlightColor" alignment="3" min="-2" pref="15" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblAxis" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="axisColor" alignment="3" min="-2" pref="15" max="-2" attributes="0"/>
</Group>
</Group>
</Group>
<EmptySpace min="-2" pref="29" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblCellSize" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="lblFont" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="-2" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblCellWidth" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="cellWidth" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="btnChooseFont" alignment="3" pref="29" max="32767" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblCellHeight" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="cellHeight" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace pref="8" max="32767" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="btnCancel" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="btnOk" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="btnApply" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="reset" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Component class="javax.swing.JLabel" name="lblEcuDef">
<Properties>
<Property name="text" type="java.lang.String" value="ECU Definition File:"/>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="ecuDefinitionFile">
</Component>
<Component class="javax.swing.JButton" name="btnEcuDefinitionBrowse">
<Properties>
<Property name="text" type="java.lang.String" value="Browse"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblMax">
<Properties>
<Property name="text" type="java.lang.String" value="Maximum Value:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblMin">
<Properties>
<Property name="text" type="java.lang.String" value="Minimum Value:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblHighlight">
<Properties>
<Property name="text" type="java.lang.String" value="Highlighted Cell:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblAxis">
<Properties>
<Property name="text" type="java.lang.String" value="Axis Cell:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="maxColor">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="0" green="0" red="ff" type="rgb"/>
</Property>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.LineBorderInfo">
<LineBorder/>
</Border>
</Property>
<Property name="opaque" type="boolean" value="true"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="minColor">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="0" green="0" red="ff" type="rgb"/>
</Property>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.LineBorderInfo">
<LineBorder/>
</Border>
</Property>
<Property name="opaque" type="boolean" value="true"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="highlightColor">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="0" green="0" red="ff" type="rgb"/>
</Property>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.LineBorderInfo">
<LineBorder/>
</Border>
</Property>
<Property name="opaque" type="boolean" value="true"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="axisColor">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="0" green="0" red="ff" type="rgb"/>
</Property>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.LineBorderInfo">
<LineBorder/>
</Border>
</Property>
<Property name="opaque" type="boolean" value="true"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblIncrease">
<Properties>
<Property name="text" type="java.lang.String" value="Increased Value:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblDecrease">
<Properties>
<Property name="text" type="java.lang.String" value="Decreased Value:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblBackgrounds">
<Properties>
<Property name="text" type="java.lang.String" value="Backgrounds"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="increaseColor">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="0" green="0" red="ff" type="rgb"/>
</Property>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.LineBorderInfo">
<LineBorder/>
</Border>
</Property>
<Property name="opaque" type="boolean" value="true"/>
</Properties>
</Component>
<Component class="javax.swing.JCheckBox" name="obsoleteWarning">
<Properties>
<Property name="text" type="java.lang.String" value="Warn me when opening out of date ECU image revision"/>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
<EmptyBorder bottom="0" left="0" right="0" top="0"/>
</Border>
</Property>
<Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
<Insets value="[0, 0, 0, 0]"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JCheckBox" name="calcConflictWarning">
<Properties>
<Property name="text" type="java.lang.String" value="Warn me when real and byte value calculations conflict"/>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
<EmptyBorder bottom="0" left="0" right="0" top="0"/>
</Border>
</Property>
<Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
<Insets value="[0, 0, 0, 0]"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JCheckBox" name="debug">
<Properties>
<Property name="text" type="java.lang.String" value="Debug mode"/>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
<EmptyBorder bottom="0" left="0" right="0" top="0"/>
</Border>
</Property>
<Property name="enabled" type="boolean" value="false"/>
<Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
<Insets value="[0, 0, 0, 0]"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="btnCancel">
<Properties>
<Property name="mnemonic" type="int" value="67"/>
<Property name="text" type="java.lang.String" value="Cancel"/>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="btnOk">
<Properties>
<Property name="mnemonic" type="int" value="79"/>
<Property name="text" type="java.lang.String" value="OK"/>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="btnApply">
<Properties>
<Property name="mnemonic" type="int" value="65"/>
<Property name="text" type="java.lang.String" value="Apply"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="decreaseColor">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="0" green="0" red="ff" type="rgb"/>
</Property>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.LineBorderInfo">
<LineBorder/>
</Border>
</Property>
<Property name="opaque" type="boolean" value="true"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblBorders">
<Properties>
<Property name="text" type="java.lang.String" value="Borders"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblCellSize">
<Properties>
<Property name="text" type="java.lang.String" value="Cell Size"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblCellHeight">
<Properties>
<Property name="text" type="java.lang.String" value="Height:"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblCellWidth">
<Properties>
<Property name="text" type="java.lang.String" value="Width:"/>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="cellWidth">
</Component>
<Component class="javax.swing.JTextField" name="cellHeight">
</Component>
<Component class="javax.swing.JCheckBox" name="singleTableView">
<Properties>
<Property name="text" type="java.lang.String" value="Open tables in place of existing tables"/>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
<EmptyBorder bottom="0" left="0" right="0" top="0"/>
</Border>
</Property>
<Property name="enabled" type="boolean" value="false"/>
<Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
<Insets value="[0, 0, 0, 0]"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblFont">
<Properties>
<Property name="text" type="java.lang.String" value="Font"/>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="btnChooseFont">
<Properties>
<Property name="text" type="java.lang.String" value="Choose"/>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="reset">
<Properties>
<Property name="text" type="java.lang.String" value="Restore Defaults"/>
</Properties>
</Component>
</SubComponents>
</Form>

View File

@ -0,0 +1,503 @@
package enginuity.swing;
import ZoeloeSoft.projects.JFontChooser.JFontChooser;
import enginuity.ECUEditor;
import enginuity.Settings;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import javax.swing.JColorChooser;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
public class SettingsForm extends JFrame implements MouseListener {
Settings settings;
ECUEditor parent;
public SettingsForm(ECUEditor parent) {
this.parent = parent;
settings = parent.getSettings();
initComponents();
initSettings();
maxColor.addMouseListener(this);
minColor.addMouseListener(this);
highlightColor.addMouseListener(this);
axisColor.addMouseListener(this);
increaseColor.addMouseListener(this);
decreaseColor.addMouseListener(this);
btnOk.addMouseListener(this);
btnApply.addMouseListener(this);
btnCancel.addMouseListener(this);
btnEcuDefinitionBrowse.addMouseListener(this);
btnChooseFont.addMouseListener(this);
reset.addMouseListener(this);
}
private void initSettings() {
ecuDefinitionFile.setText(this.settings.getEcuDefinitionFile().getAbsolutePath());
obsoleteWarning.setSelected(settings.isObsoleteWarning());
calcConflictWarning.setSelected(settings.isCalcConflictWarning());
singleTableView.setSelected(settings.isSingleTableView());
debug.setSelected(settings.isDebug());
maxColor.setBackground(settings.getMaxColor());
minColor.setBackground(settings.getMinColor());
highlightColor.setBackground(settings.getHighlightColor());
axisColor.setBackground(settings.getAxisColor());
increaseColor.setBackground(settings.getIncreaseBorder());
decreaseColor.setBackground(settings.getDecreaseBorder());
cellWidth.setText(((int)settings.getCellSize().getWidth())+"");
cellHeight.setText(((int)settings.getCellSize().getHeight())+"");
btnChooseFont.setFont(settings.getTableFont());
btnChooseFont.setText(settings.getTableFont().getFontName());
}
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
private void initComponents() {
lblEcuDef = new javax.swing.JLabel();
ecuDefinitionFile = new javax.swing.JTextField();
btnEcuDefinitionBrowse = new javax.swing.JButton();
lblMax = new javax.swing.JLabel();
lblMin = new javax.swing.JLabel();
lblHighlight = new javax.swing.JLabel();
lblAxis = new javax.swing.JLabel();
maxColor = new javax.swing.JLabel();
minColor = new javax.swing.JLabel();
highlightColor = new javax.swing.JLabel();
axisColor = new javax.swing.JLabel();
lblIncrease = new javax.swing.JLabel();
lblDecrease = new javax.swing.JLabel();
lblBackgrounds = new javax.swing.JLabel();
increaseColor = new javax.swing.JLabel();
obsoleteWarning = new javax.swing.JCheckBox();
calcConflictWarning = new javax.swing.JCheckBox();
debug = new javax.swing.JCheckBox();
btnCancel = new javax.swing.JButton();
btnOk = new javax.swing.JButton();
btnApply = new javax.swing.JButton();
decreaseColor = new javax.swing.JLabel();
lblBorders = new javax.swing.JLabel();
lblCellSize = new javax.swing.JLabel();
lblCellHeight = new javax.swing.JLabel();
lblCellWidth = new javax.swing.JLabel();
cellWidth = new javax.swing.JTextField();
cellHeight = new javax.swing.JTextField();
singleTableView = new javax.swing.JCheckBox();
lblFont = new javax.swing.JLabel();
btnChooseFont = new javax.swing.JButton();
reset = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Enginuity Settings");
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
lblEcuDef.setText("ECU Definition File:");
btnEcuDefinitionBrowse.setText("Browse");
lblMax.setText("Maximum Value:");
lblMin.setText("Minimum Value:");
lblHighlight.setText("Highlighted Cell:");
lblAxis.setText("Axis Cell:");
maxColor.setBackground(new java.awt.Color(255, 0, 0));
maxColor.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
maxColor.setOpaque(true);
minColor.setBackground(new java.awt.Color(255, 0, 0));
minColor.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
minColor.setOpaque(true);
highlightColor.setBackground(new java.awt.Color(255, 0, 0));
highlightColor.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
highlightColor.setOpaque(true);
axisColor.setBackground(new java.awt.Color(255, 0, 0));
axisColor.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
axisColor.setOpaque(true);
lblIncrease.setText("Increased Value:");
lblDecrease.setText("Decreased Value:");
lblBackgrounds.setText("Backgrounds");
increaseColor.setBackground(new java.awt.Color(255, 0, 0));
increaseColor.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
increaseColor.setOpaque(true);
obsoleteWarning.setText("Warn me when opening out of date ECU image revision");
obsoleteWarning.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
obsoleteWarning.setMargin(new java.awt.Insets(0, 0, 0, 0));
calcConflictWarning.setText("Warn me when real and byte value calculations conflict");
calcConflictWarning.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
calcConflictWarning.setMargin(new java.awt.Insets(0, 0, 0, 0));
debug.setText("Debug mode");
debug.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
debug.setEnabled(false);
debug.setMargin(new java.awt.Insets(0, 0, 0, 0));
btnCancel.setMnemonic('C');
btnCancel.setText("Cancel");
btnOk.setMnemonic('O');
btnOk.setText("OK");
btnApply.setMnemonic('A');
btnApply.setText("Apply");
decreaseColor.setBackground(new java.awt.Color(255, 0, 0));
decreaseColor.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
decreaseColor.setOpaque(true);
lblBorders.setText("Borders");
lblCellSize.setText("Cell Size");
lblCellHeight.setText("Height:");
lblCellWidth.setText("Width:");
singleTableView.setText("Open tables in place of existing tables");
singleTableView.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
singleTableView.setEnabled(false);
singleTableView.setMargin(new java.awt.Insets(0, 0, 0, 0));
lblFont.setText("Font");
btnChooseFont.setText("Choose");
reset.setText("Restore Defaults");
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(10, 10, 10)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(lblEcuDef)
.add(layout.createSequentialGroup()
.add(ecuDefinitionFile, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 257, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(btnEcuDefinitionBrowse))))
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(calcConflictWarning)
.add(obsoleteWarning)
.add(singleTableView)
.add(debug)))
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(lblAxis)
.add(lblHighlight)
.add(lblMin))
.add(lblMax))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, maxColor, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 50, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(org.jdesktop.layout.GroupLayout.TRAILING, minColor, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 50, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(org.jdesktop.layout.GroupLayout.TRAILING, highlightColor, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 50, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(org.jdesktop.layout.GroupLayout.TRAILING, axisColor, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 50, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(layout.createSequentialGroup()
.add(53, 53, 53)
.add(lblCellSize)))
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(57, 57, 57)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(lblDecrease)
.add(layout.createSequentialGroup()
.add(3, 3, 3)
.add(lblIncrease)))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(increaseColor, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 50, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(decreaseColor, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 50, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(layout.createSequentialGroup()
.add(47, 47, 47)
.add(lblBorders))
.add(btnChooseFont, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 140, Short.MAX_VALUE)))
.add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(lblFont)
.add(65, 65, 65))))
.add(layout.createSequentialGroup()
.add(47, 47, 47)
.add(lblBackgrounds))))
.add(layout.createSequentialGroup()
.add(20, 20, 20)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(lblCellWidth)
.add(lblCellHeight))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(layout.createSequentialGroup()
.add(10, 10, 10)
.add(cellWidth, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 50, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(cellHeight, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 50, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.add(reset)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 34, Short.MAX_VALUE)
.add(btnApply)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(btnOk)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(btnCancel)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(lblEcuDef)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(btnEcuDefinitionBrowse)
.add(ecuDefinitionFile, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(27, 27, 27)
.add(obsoleteWarning)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(calcConflictWarning)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(singleTableView)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(debug)
.add(31, 31, 31)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(lblBorders)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(increaseColor, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 15, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(lblIncrease))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblDecrease)
.add(decreaseColor, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 15, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(layout.createSequentialGroup()
.add(lblBackgrounds)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblMax)
.add(maxColor, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 15, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblMin)
.add(minColor, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 15, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblHighlight)
.add(highlightColor, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 15, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblAxis)
.add(axisColor, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 15, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))))
.add(29, 29, 29)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblCellSize)
.add(lblFont))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblCellWidth)
.add(cellWidth, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(btnChooseFont, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 29, Short.MAX_VALUE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblCellHeight)
.add(cellHeight, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 8, Short.MAX_VALUE)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(btnCancel)
.add(btnOk)
.add(btnApply)
.add(reset))
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
public void mouseClicked(MouseEvent e) {
if (e.getSource() == maxColor) {
JColorChooser chooser = new JColorChooser();
Color color = chooser.showDialog(this.getContentPane(), "Background Color", settings.getMaxColor());
if (color != null) {
maxColor.setBackground(color);
}
} else if (e.getSource() == minColor) {
JColorChooser chooser = new JColorChooser();
Color color = chooser.showDialog(this.getContentPane(), "Background Color", settings.getMinColor());
if (color != null) {
minColor.setBackground(color);
}
} else if (e.getSource() == highlightColor) {
JColorChooser chooser = new JColorChooser();
Color color = chooser.showDialog(this.getContentPane(), "Background Color", settings.getHighlightColor());
if (color != null) {
highlightColor.setBackground(color);
}
} else if (e.getSource() == axisColor) {
JColorChooser chooser = new JColorChooser();
Color color = chooser.showDialog(this.getContentPane(), "Background Color", settings.getAxisColor());
if (color != null) {
axisColor.setBackground(color);
}
} else if (e.getSource() == increaseColor) {
JColorChooser chooser = new JColorChooser();
Color color = chooser.showDialog(this.getContentPane(), "Background Color", settings.getIncreaseBorder());
if (color != null) {
increaseColor.setBackground(color);
}
} else if (e.getSource() == decreaseColor) {
JColorChooser chooser = new JColorChooser();
Color color = chooser.showDialog(this.getContentPane(), "Background Color", settings.getDecreaseBorder());
if (color != null) {
decreaseColor.setBackground(color);
}
} else if (e.getSource() == btnApply) {
applySettings();
} else if (e.getSource() == btnOk) {
applySettings();
this.dispose();
} else if (e.getSource() == btnCancel) {
this.dispose();
} else if (e.getSource() == btnEcuDefinitionBrowse) {
JFileChooser fc = new JFileChooser(new File(ecuDefinitionFile.getText()));
fc.setFileFilter(new XMLFilter());
if (fc.showOpenDialog(this) == fc.APPROVE_OPTION) {
ecuDefinitionFile.setText(fc.getSelectedFile().getAbsolutePath());
}
} else if (e.getSource() == btnChooseFont) {
JFontChooser fc = new JFontChooser(this);
fc.setLocationRelativeTo(this);
if (fc.showDialog(settings.getTableFont()) == fc.OK_OPTION) {
btnChooseFont.setFont(fc.getFont());
btnChooseFont.setText(fc.getFont().getFontName());
}
} else if (e.getSource() == reset) {
settings = new Settings();
initSettings();
}
}
public void applySettings() {
try {
Integer.parseInt(cellHeight.getText());
} catch (NumberFormatException ex) {
//number formatted imporperly, reset
cellHeight.setText((int)(settings.getCellSize().getHeight())+"");
}
try {
Integer.parseInt(cellWidth.getText());
} catch (NumberFormatException ex) {
//number formatted imporperly, reset
cellWidth.setText((int)(settings.getCellSize().getWidth())+"");
}
settings.addEcuDefinitionFile(new File(ecuDefinitionFile.getText()));
settings.setObsoleteWarning(obsoleteWarning.isSelected());
settings.setCalcConflictWarning(calcConflictWarning.isSelected());
settings.setSingleTableView(singleTableView.isSelected());
settings.setDebug(debug.isSelected());
settings.setMaxColor(maxColor.getBackground());
settings.setMinColor(minColor.getBackground());
settings.setHighlightColor(highlightColor.getBackground());
settings.setAxisColor(axisColor.getBackground());
settings.setIncreaseBorder(increaseColor.getBackground());
settings.setDecreaseBorder(decreaseColor.getBackground());
settings.setCellSize(new Dimension(Integer.parseInt(cellWidth.getText()),
Integer.parseInt(cellHeight.getText())));
settings.setTableFont(btnChooseFont.getFont());
parent.setSettings(settings);
}
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel axisColor;
private javax.swing.JButton btnApply;
private javax.swing.JButton btnCancel;
private javax.swing.JButton btnChooseFont;
private javax.swing.JButton btnEcuDefinitionBrowse;
private javax.swing.JButton btnOk;
private javax.swing.JCheckBox calcConflictWarning;
private javax.swing.JTextField cellHeight;
private javax.swing.JTextField cellWidth;
private javax.swing.JCheckBox debug;
private javax.swing.JLabel decreaseColor;
private javax.swing.JTextField ecuDefinitionFile;
private javax.swing.JLabel highlightColor;
private javax.swing.JLabel increaseColor;
private javax.swing.JLabel lblAxis;
private javax.swing.JLabel lblBackgrounds;
private javax.swing.JLabel lblBorders;
private javax.swing.JLabel lblCellHeight;
private javax.swing.JLabel lblCellSize;
private javax.swing.JLabel lblCellWidth;
private javax.swing.JLabel lblDecrease;
private javax.swing.JLabel lblEcuDef;
private javax.swing.JLabel lblFont;
private javax.swing.JLabel lblHighlight;
private javax.swing.JLabel lblIncrease;
private javax.swing.JLabel lblMax;
private javax.swing.JLabel lblMin;
private javax.swing.JLabel maxColor;
private javax.swing.JLabel minColor;
private javax.swing.JCheckBox obsoleteWarning;
private javax.swing.JButton reset;
private javax.swing.JCheckBox singleTableView;
// End of variables declaration//GEN-END:variables
}

View File

@ -0,0 +1,20 @@
package enginuity.swing;
import enginuity.maps.Table;
import javax.swing.tree.DefaultMutableTreeNode;
public class TableChooserTreeNode extends DefaultMutableTreeNode {
private Table table;
public TableChooserTreeNode(String text, Table table) {
super(text);
this.table = table;
}
private TableChooserTreeNode() { }
public Table getTable() {
return table;
}
}

View File

@ -0,0 +1,57 @@
package enginuity.swing;
import enginuity.swing.TableMenuBar;
import enginuity.swing.TableToolBar;
import enginuity.maps.Table;
import java.awt.BorderLayout;
import javax.swing.BorderFactory;
import javax.swing.JInternalFrame;
import javax.swing.event.InternalFrameEvent;
import javax.swing.event.InternalFrameListener;
public class TableFrame extends JInternalFrame implements InternalFrameListener {
private Table table;
private TableToolBar toolBar;
public TableFrame(Table table) {
super(table.getRom().getFileName() + " - " + table.getName(), true, true);
this.setTable(table);
this.add(table);
this.setFrameIcon(null);
this.setBorder(BorderFactory.createBevelBorder(0));
this.setVisible(false);
toolBar = new TableToolBar(table, this);
this.add(toolBar, BorderLayout.NORTH);
this.setJMenuBar(new TableMenuBar(table));
this.setDefaultCloseOperation(this.HIDE_ON_CLOSE);
table.setFrame(this);
this.addInternalFrameListener(this);
}
public TableToolBar getToolBar() {
return toolBar;
}
public void internalFrameActivated(InternalFrameEvent e) {
getTable().getRom().getContainer().setLastSelectedRom(getTable().getRom());
}
public void internalFrameOpened(InternalFrameEvent e) { }
public void internalFrameClosing(InternalFrameEvent e) {
getTable().getRom().getContainer().removeDisplayTable(this);
}
public void internalFrameClosed(InternalFrameEvent e) { }
public void internalFrameIconified(InternalFrameEvent e) { }
public void internalFrameDeiconified(InternalFrameEvent e) { }
public void internalFrameDeactivated(InternalFrameEvent e) { }
public Table getTable() {
return table;
}
public void setTable(Table table) {
this.table = table;
}
}

View File

@ -0,0 +1,177 @@
package enginuity.swing;
import enginuity.maps.Table;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JSeparator;
public class TableMenuBar extends JMenuBar implements ActionListener {
private Table table;
private JMenu fileMenu = new JMenu("Table");
private JMenuItem graph = new JMenuItem("View Graph");
private JMenuItem overlay = new JMenuItem("Overlay Log");
private JMenu compareMenu = new JMenu("Compare");
private JRadioButtonMenuItem compareOriginal = new JRadioButtonMenuItem("Show Changes");
private JRadioButtonMenuItem compareMap = new JRadioButtonMenuItem("Compare to Another Map");
private JRadioButtonMenuItem compareOff = new JRadioButtonMenuItem("Off");
private JMenu compareDisplay = new JMenu("Display");
private JRadioButtonMenuItem comparePercent = new JRadioButtonMenuItem("Percent Difference");
private JRadioButtonMenuItem compareAbsolute = new JRadioButtonMenuItem("Absolute Difference");
private JMenuItem close = new JMenuItem("Close Table");
private JMenu editMenu = new JMenu("Edit");
private JMenuItem undoSel = new JMenuItem("Undo Selected Changes");
private JMenuItem undoAll = new JMenuItem("Undo All Changes");
private JMenuItem revert = new JMenuItem("Set Revert Point");
private JMenuItem copySel = new JMenuItem("Copy Selection");
private JMenuItem copyTable = new JMenuItem("Copy Table");
private JMenuItem paste = new JMenuItem("Paste");
private JMenu viewMenu = new JMenu("View");
private JMenuItem tableProperties = new JMenuItem("Table Properties");
private ButtonGroup compareGroup = new ButtonGroup();
private ButtonGroup compareDisplayGroup = new ButtonGroup();
public TableMenuBar(Table table) {
super();
this.table = table;
this.add(fileMenu);
fileMenu.add(graph);
fileMenu.add(overlay);
fileMenu.add(compareMenu);
compareMenu.add(compareOriginal);
compareMenu.add(compareMap);
compareMenu.add(compareOff);
compareMenu.add(new JSeparator());
compareMenu.add(compareDisplay);
compareDisplay.add(comparePercent);
compareDisplay.add(compareAbsolute);
fileMenu.add(new JSeparator());
fileMenu.add(close);
close.setText("Close " + table.getName());
compareMenu.setMnemonic('C');
compareOriginal.setMnemonic('C');
compareMap.setMnemonic('M');
compareOff.setMnemonic('O');
compareOff.setSelected(true);
compareDisplay.setMnemonic('D');
comparePercent.setMnemonic('P');
compareAbsolute.setMnemonic('A');
compareAbsolute.setSelected(true);
compareGroup.add(compareOriginal);
compareGroup.add(compareMap);
compareGroup.add(compareOff);
compareDisplayGroup.add(comparePercent);
compareDisplayGroup.add(compareAbsolute);
compareOriginal.addActionListener(this);
compareMap.addActionListener(this);
compareOff.addActionListener(this);
comparePercent.addActionListener(this);
compareAbsolute.addActionListener(this);
// FOR 0.2.7.4b ONLY!! DELETE FOR 0.2.8b!
//compareMap.setEnabled(false);
this.add(editMenu);
editMenu.add(undoSel);
editMenu.add(undoAll);
editMenu.add(revert);
editMenu.add(new JSeparator());
editMenu.add(copySel);
editMenu.add(copyTable);
editMenu.add(new JSeparator());
editMenu.add(paste);
editMenu.setMnemonic('E');
copySel.setMnemonic('C');
copyTable.setMnemonic('T');
paste.setMnemonic('P');
copySel.addActionListener(this);
copyTable.addActionListener(this);
paste.addActionListener(this);
this.add(viewMenu);
viewMenu.add(tableProperties);
viewMenu.setMnemonic('V');
tableProperties.setMnemonic('P');
tableProperties.addActionListener(this);
graph.addActionListener(this);
overlay.addActionListener(this);
undoSel.addActionListener(this);
undoAll.addActionListener(this);
revert.addActionListener(this);
close.addActionListener(this);
fileMenu.setMnemonic('F');
fileMenu.setMnemonic('T');
graph.setMnemonic('G');
overlay.setMnemonic('L');
undoSel.setMnemonic('U');
undoAll.setMnemonic('A');
revert.setMnemonic('R');
close.setMnemonic('X');
graph.setEnabled(false);
overlay.setEnabled(false);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == undoAll) {
table.undoAll();
} else if (e.getSource() == revert) {
table.setRevertPoint();
} else if (e.getSource() == undoSel) {
table.undoSelected();
} else if (e.getSource() == close) {
table.getFrame().dispose();
} else if (e.getSource() == tableProperties) {
new JOptionPane().showMessageDialog(table, (Object)(new TablePropertyPanel(table)),
table.getName() + " Table Properties", JOptionPane.INFORMATION_MESSAGE);
} else if (e.getSource() == copySel) {
table.copySelection();
} else if (e.getSource() == copyTable) {
table.copyTable();
} else if (e.getSource() == paste) {
table.paste();
} else if (e.getSource() == compareOff) {
table.compare(table.COMPARE_OFF);
} else if (e.getSource() == compareOriginal) {
table.compare(table.COMPARE_ORIGINAL);
} else if (e.getSource() == compareMap) {
JTableChooser chooser = new JTableChooser();
if (chooser.showChooser(table.getRom().getContainer().getImages(), table.getRom().getContainer(), table) == true) {
table.pasteCompare();
table.compare(Table.COMPARE_TABLE);
}
} else if (e.getSource() == compareAbsolute) {
table.setCompareDisplay(Table.COMPARE_ABSOLUTE);
} else if (e.getSource() == comparePercent) {
table.setCompareDisplay(Table.COMPARE_PERCENT);
}
}
}

View File

@ -0,0 +1,261 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.3" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<AuxValues>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
</AuxValues>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="description" alignment="0" pref="399" max="32767" attributes="0"/>
<Component id="lblDescription" alignment="0" min="-2" max="-2" attributes="0"/>
<Group type="102" alignment="1" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="lblConversion" alignment="0" min="-2" max="-2" attributes="0"/>
<Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="lblByteToReal" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="lblRealToByte" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="lblUnit" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="byteToReal" min="-2" max="-2" attributes="0"/>
<Component id="realToByte" min="-2" max="-2" attributes="0"/>
<Component id="unit" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<Group type="102" attributes="0">
<Component id="lblTable" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="tableName" pref="213" max="32767" attributes="0"/>
</Group>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="lblStorage" min="-2" max="-2" attributes="0"/>
<Group type="102" alignment="0" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="lblStorageAddress" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="lblStorageSize" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="lblEndian" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="endian" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="storageSize" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="storageAddress" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<Group type="102" alignment="0" attributes="0">
<Component id="lblCategory" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="category" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<EmptySpace min="-2" pref="20" max="-2" attributes="0"/>
</Group>
</Group>
<EmptySpace max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblTable" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="tableName" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="-2" pref="20" max="-2" attributes="0"/>
<Component id="lblConversion" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="1" attributes="0">
<Group type="102" attributes="0">
<Component id="lblUnit" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="40" max="-2" attributes="0"/>
</Group>
<Group type="102" attributes="0">
<Component id="lblByteToReal" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="lblRealToByte" min="-2" max="-2" attributes="0"/>
</Group>
<Group type="102" alignment="1" attributes="0">
<Component id="unit" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="40" max="-2" attributes="0"/>
</Group>
<Group type="102" alignment="1" attributes="0">
<Component id="byteToReal" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="realToByte" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<EmptySpace min="-2" pref="26" max="-2" attributes="0"/>
<Component id="lblDescription" min="-2" max="-2" attributes="0"/>
</Group>
<Group type="102" alignment="0" attributes="0">
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblCategory" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="category" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="-2" pref="20" max="-2" attributes="0"/>
<Component id="lblStorage" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblStorageSize" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="storageSize" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblStorageAddress" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="storageAddress" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lblEndian" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="endian" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Component id="description" min="-2" pref="60" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Component class="javax.swing.JLabel" name="lblTable">
<Properties>
<Property name="text" type="java.lang.String" value="Table:"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="tableName">
<Properties>
<Property name="text" type="java.lang.String" value="Tablename (3D)"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblCategory">
<Properties>
<Property name="text" type="java.lang.String" value="Category:"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="category">
<Properties>
<Property name="text" type="java.lang.String" value="Category"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblStorageSize">
<Properties>
<Property name="text" type="java.lang.String" value="Storage Size:"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblStorageAddress">
<Properties>
<Property name="text" type="java.lang.String" value="Storage Address:"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblEndian">
<Properties>
<Property name="text" type="java.lang.String" value="Endian:"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblConversion">
<Properties>
<Property name="text" type="java.lang.String" value="----------- Conversion -----------"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblStorage">
<Properties>
<Property name="text" type="java.lang.String" value="---------- Storage ----------"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblByteToReal">
<Properties>
<Property name="text" type="java.lang.String" value="Byte to Real:"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblRealToByte">
<Properties>
<Property name="text" type="java.lang.String" value="Real to Byte:"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblUnit">
<Properties>
<Property name="text" type="java.lang.String" value="Unit:"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="byteToReal">
<Properties>
<Property name="text" type="java.lang.String" value="bytetoreal"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="realToByte">
<Properties>
<Property name="text" type="java.lang.String" value="realtobyte"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="unit">
<Properties>
<Property name="text" type="java.lang.String" value="unit"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="storageAddress">
<Properties>
<Property name="text" type="java.lang.String" value="0x00"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="storageSize">
<Properties>
<Property name="text" type="java.lang.String" value="uint16"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="endian">
<Properties>
<Property name="text" type="java.lang.String" value="little"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblDescription">
<Properties>
<Property name="text" type="java.lang.String" value="Description:"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="description">
<Properties>
<Property name="horizontalAlignment" type="int" value="2"/>
<Property name="text" type="java.lang.String" value="Description"/>
<Property name="verticalAlignment" type="int" value="1"/>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
</SubComponents>
</Form>

View File

@ -0,0 +1,232 @@
package enginuity.swing;
import enginuity.maps.Table;
public class TablePropertyPanel extends javax.swing.JPanel {
public TablePropertyPanel(Table table) {
initComponents();
setVisible(true);
tableName.setText(table.getName() + " (" + table.getType() + "D)");
category.setText(table.getCategory());
unit.setText(table.getScale().getUnit());
byteToReal.setText(table.getScale().getExpression());
realToByte.setText(table.getScale().getByteExpression());
storageSize.setText("uint" + (table.getStorageType() * 8));
storageAddress.setText("0x" + Integer.toHexString(table.getStorageAddress()));
if (table.getEndian() == table.ENDIAN_BIG) endian.setText("big");
else endian.setText("little");
description.setText(table.getDescription());
System.out.println(table.getDescription());
}
private TablePropertyPanel() { }
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
private void initComponents() {
lblTable = new javax.swing.JLabel();
tableName = new javax.swing.JLabel();
lblCategory = new javax.swing.JLabel();
category = new javax.swing.JLabel();
lblStorageSize = new javax.swing.JLabel();
lblStorageAddress = new javax.swing.JLabel();
lblEndian = new javax.swing.JLabel();
lblConversion = new javax.swing.JLabel();
lblStorage = new javax.swing.JLabel();
lblByteToReal = new javax.swing.JLabel();
lblRealToByte = new javax.swing.JLabel();
lblUnit = new javax.swing.JLabel();
byteToReal = new javax.swing.JLabel();
realToByte = new javax.swing.JLabel();
unit = new javax.swing.JLabel();
storageAddress = new javax.swing.JLabel();
storageSize = new javax.swing.JLabel();
endian = new javax.swing.JLabel();
lblDescription = new javax.swing.JLabel();
description = new javax.swing.JLabel();
lblTable.setText("Table:");
lblTable.setFocusable(false);
tableName.setText("Tablename (3D)");
tableName.setFocusable(false);
lblCategory.setText("Category:");
lblCategory.setFocusable(false);
category.setText("Category");
category.setFocusable(false);
lblStorageSize.setText("Storage Size:");
lblStorageSize.setFocusable(false);
lblStorageAddress.setText("Storage Address:");
lblStorageAddress.setFocusable(false);
lblEndian.setText("Endian:");
lblEndian.setFocusable(false);
lblConversion.setText("----------- Conversion -----------");
lblConversion.setFocusable(false);
lblStorage.setText("---------- Storage ----------");
lblStorage.setFocusable(false);
lblByteToReal.setText("Byte to Real:");
lblByteToReal.setFocusable(false);
lblRealToByte.setText("Real to Byte:");
lblRealToByte.setFocusable(false);
lblUnit.setText("Unit:");
lblUnit.setFocusable(false);
byteToReal.setText("bytetoreal");
byteToReal.setFocusable(false);
realToByte.setText("realtobyte");
realToByte.setFocusable(false);
unit.setText("unit");
unit.setFocusable(false);
storageAddress.setText("0x00");
storageAddress.setFocusable(false);
storageSize.setText("uint16");
storageSize.setFocusable(false);
endian.setText("little");
endian.setFocusable(false);
lblDescription.setText("Description:");
lblDescription.setFocusable(false);
description.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
description.setText("Description");
description.setVerticalAlignment(javax.swing.SwingConstants.TOP);
description.setFocusable(false);
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(description, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 399, Short.MAX_VALUE)
.add(lblDescription)
.add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(lblConversion)
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(lblByteToReal)
.add(lblRealToByte)
.add(lblUnit))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(byteToReal)
.add(realToByte)
.add(unit)))
.add(layout.createSequentialGroup()
.add(lblTable)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(tableName, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 213, Short.MAX_VALUE)))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(lblStorage)
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(lblStorageAddress)
.add(lblStorageSize)
.add(lblEndian))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(endian)
.add(storageSize)
.add(storageAddress)))
.add(layout.createSequentialGroup()
.add(lblCategory)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(category)))
.add(20, 20, 20)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblTable)
.add(tableName))
.add(20, 20, 20)
.add(lblConversion)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(layout.createSequentialGroup()
.add(lblUnit)
.add(40, 40, 40))
.add(layout.createSequentialGroup()
.add(lblByteToReal)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(lblRealToByte))
.add(layout.createSequentialGroup()
.add(unit)
.add(40, 40, 40))
.add(layout.createSequentialGroup()
.add(byteToReal)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(realToByte)))
.add(26, 26, 26)
.add(lblDescription))
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblCategory)
.add(category))
.add(20, 20, 20)
.add(lblStorage)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblStorageSize)
.add(storageSize))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblStorageAddress)
.add(storageAddress))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(lblEndian)
.add(endian))))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(description, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 60, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel byteToReal;
private javax.swing.JLabel category;
private javax.swing.JLabel description;
private javax.swing.JLabel endian;
private javax.swing.JLabel lblByteToReal;
private javax.swing.JLabel lblCategory;
private javax.swing.JLabel lblConversion;
private javax.swing.JLabel lblDescription;
private javax.swing.JLabel lblEndian;
private javax.swing.JLabel lblRealToByte;
private javax.swing.JLabel lblStorage;
private javax.swing.JLabel lblStorageAddress;
private javax.swing.JLabel lblStorageSize;
private javax.swing.JLabel lblTable;
private javax.swing.JLabel lblUnit;
private javax.swing.JLabel realToByte;
private javax.swing.JLabel storageAddress;
private javax.swing.JLabel storageSize;
private javax.swing.JLabel tableName;
private javax.swing.JLabel unit;
// End of variables declaration//GEN-END:variables
}

View File

@ -0,0 +1,176 @@
package enginuity.swing;
import enginuity.swing.TableFrame;
import enginuity.maps.Table;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.DecimalFormat;
import java.text.ParseException;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import javax.swing.border.LineBorder;
public class TableToolBar extends JToolBar implements MouseListener {
private JButton incrementFine = new JButton(new ImageIcon("./graphics/icon-incfine.png"));
private JButton decrementFine = new JButton(new ImageIcon("./graphics/icon-decfine.png"));
private JButton incrementCoarse = new JButton(new ImageIcon("./graphics/icon-inccoarse.png"));
private JButton decrementCoarse = new JButton(new ImageIcon("./graphics/icon-deccoarse.png"));
private JButton setValue = new JButton("Set");
private JFormattedTextField incrementBy = new JFormattedTextField(new DecimalFormat("#"));
private JFormattedTextField setValueText = new JFormattedTextField(new DecimalFormat("#.####"));
private Table table;
private TableFrame frame;
public TableToolBar(Table table, TableFrame frame) {
this.table = table;
this.frame = frame;
this.setFloatable(false);
this.add(incrementFine);
this.add(decrementFine);
this.add(new JLabel(" "));
this.add(incrementCoarse);
this.add(decrementCoarse);
this.add(new JLabel(" "));
this.add(incrementBy);
this.add(new JLabel(" "));
this.add(setValueText);
this.add(new JLabel(" "));
this.add(setValue);
incrementFine.setMaximumSize(new Dimension(33,33));
incrementFine.setBorder(new LineBorder(new Color(150,150,150), 1));
decrementFine.setMaximumSize(new Dimension(33,33));
decrementFine.setBorder(new LineBorder(new Color(150,150,150), 1));
incrementCoarse.setMaximumSize(new Dimension(33,33));
incrementCoarse.setBorder(new LineBorder(new Color(150,150,150), 1));
decrementCoarse.setMaximumSize(new Dimension(33,33));
decrementCoarse.setBorder(new LineBorder(new Color(150,150,150), 1));
setValue.setMaximumSize(new Dimension(33,23));
setValue.setBorder(new LineBorder(new Color(150,150,150), 1));
incrementBy.setAlignmentX(JTextArea.CENTER_ALIGNMENT);
incrementBy.setAlignmentY(JTextArea.CENTER_ALIGNMENT);
incrementBy.setMaximumSize(new Dimension(45, 23));
setValueText.setAlignmentX(JTextArea.CENTER_ALIGNMENT);
setValueText.setAlignmentY(JTextArea.CENTER_ALIGNMENT);
setValueText.setMaximumSize(new Dimension(45, 23));
incrementFine.setToolTipText("Increment Value (Fine)");
decrementFine.setToolTipText("Decrement Value (Fine)");
incrementCoarse.setToolTipText("Increment Value (Coarse)");
decrementCoarse.setToolTipText("Decrement Value (Coarse)");
setValue.setToolTipText("Set Absolute Value");
setValueText.setToolTipText("Set Absolute Value");
incrementBy.setToolTipText("Coarse Value Adjustment");
incrementFine.addMouseListener(this);
decrementFine.addMouseListener(this);
incrementCoarse.addMouseListener(this);
decrementCoarse.addMouseListener(this);
setValue.addMouseListener(this);
incrementBy.setValue(Math.abs(table.getScale().getIncrement()));
// key binding actions
Action enterAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
getTable().requestFocus();
setValue();
}
};
// set input mapping
InputMap im = getInputMap(this.WHEN_IN_FOCUSED_WINDOW);
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
im.put(enter, "enterAction");
getActionMap().put(im.get(enter), enterAction);
incrementFine.getInputMap().put(enter, "enterAction");
decrementFine.getInputMap().put(enter, "enterAction");
incrementCoarse.getInputMap().put(enter, "enterAction");
decrementCoarse.getInputMap().put(enter, "enterAction");
incrementBy.getInputMap().put(enter, "enterAction");
setValueText.getInputMap().put(enter, "enterAction");
setValue.getInputMap().put(enter, "enterAction");
incrementFine.getInputMap().put(enter, "enterAction");
}
public Table getTable() {
return table;
}
public void mouseClicked(MouseEvent e) {
if (e.getSource() == incrementCoarse) incrementCoarse();
else if (e.getSource() == decrementCoarse) decrementCoarse();
else if (e.getSource() == incrementFine) incrementFine();
else if (e.getSource() == decrementFine) decrementFine();
else if (e.getSource() == setValue) setValue();
table.colorize();
}
public void setValue() {
table.setRealValue(setValueText.getText()+"");
}
public void incrementFine() {
if (table.getScale().getIncrement() > 0) table.increment(1);
else table.increment(-1);
}
public void decrementFine() {
if (table.getScale().getIncrement() > 0) table.increment(-1);
else table.increment(1);
}
public void incrementCoarse() {
table.increment(Integer.parseInt(incrementBy.getValue()+""));
}
public void decrementCoarse() {
table.increment(0 - Integer.parseInt(incrementBy.getValue()+""));
}
public void setCoarseValue(int input) {
incrementBy.setText(input+"");
try {
incrementBy.commitEdit();
} catch (ParseException ex) { }
}
public void focusSetValue(char input) {
setValueText.requestFocus();
setValueText.setText(input+"");
}
public void setInputMap(InputMap im) {
incrementFine.setInputMap(this.WHEN_FOCUSED, im);
decrementFine.setInputMap(this.WHEN_FOCUSED, im);
incrementCoarse.setInputMap(this.WHEN_FOCUSED, im);
decrementCoarse.setInputMap(this.WHEN_FOCUSED, im);
setValue.setInputMap(this.WHEN_FOCUSED, im);
}
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
}

View File

@ -0,0 +1,56 @@
package enginuity.swing;
import enginuity.maps.Rom;
import enginuity.maps.Table;
import javax.swing.tree.DefaultMutableTreeNode;
public class TableTreeNode extends DefaultMutableTreeNode {
private String type;
private Rom rom;
private Table table;
private String toolTip;
private TableFrame frame;
public TableTreeNode(Table table) {
super(table.getName() + " (" + table.getType() + "D)");
this.table = table;
this.frame = table.getFrame();
}
public String getType() {
return type;
}
public Rom getRom() {
return rom;
}
public void setRom(Rom rom) {
this.rom = rom;
}
public Table getTable() {
return table;
}
public void setTable(Table table) {
this.table = table;
}
public void setToolTipText(String input) {
toolTip = input;
}
public String getToolTipText() {
return toolTip;
}
public TableFrame getFrame() {
return frame;
}
public void setFrame(TableFrame frame) {
this.frame = frame;
}
}

View File

@ -0,0 +1,296 @@
package enginuity.swing;
import java.awt.*;
import javax.swing.*;
import java.beans.*;
/**
VTextIcon is an Icon implementation which draws a short string vertically.
It's useful for JTabbedPanes with LEFT or RIGHT tabs but can be used in any
component which supports Icons, such as JLabel or JButton
You can provide a hint to indicate whether to rotate the string
to the left or right, or not at all, and it checks to make sure
that the rotation is legal for the given string
(for example, Chinese/Japanese/Korean scripts have special rules when
drawn vertically and should never be rotated)
*/
public class VTextIcon extends Component implements Icon, PropertyChangeListener {
String fLabel;
String[] fCharStrings; // for efficiency, break the fLabel into one-char strings to be passed to drawString
int[] fCharWidths; // Roman characters should be centered when not rotated (Japanese fonts are monospaced)
int[] fPosition; // Japanese half-height characters need to be shifted when drawn vertically
int fWidth, fHeight, fCharHeight, fDescent; // Cached for speed
int fRotation;
Component fComponent;
static final int POSITION_NORMAL = 0;
static final int POSITION_TOP_RIGHT = 1;
static final int POSITION_FAR_TOP_RIGHT = 2;
public static final int ROTATE_DEFAULT = 0x00;
public static final int ROTATE_NONE = 0x01;
public static final int ROTATE_LEFT = 0x02;
public static final int ROTATE_RIGHT = 0x04;
/**
* Creates a <code>VTextIcon</code> for the specified <code>component</code>
* with the specified <code>label</code>.
* It sets the orientation to the default for the string
* @see #verifyRotation
*/
public VTextIcon(Component component, String label) {
this(component, label, ROTATE_DEFAULT);
}
/**
* Creates a <code>VTextIcon</code> for the specified <code>component</code>
* with the specified <code>label</code>.
* It sets the orientation to the provided value if it's legal for the string
* @see #verifyRotation
*/
public VTextIcon(Component component, String label, int rotateHint) {
fComponent = component;
fLabel = label;
fRotation = verifyRotation(label, rotateHint);
calcDimensions();
fComponent.addPropertyChangeListener(this);
}
/**
* sets the label to the given string, updating the orientation as needed
* and invalidating the layout if the size changes
* @see #verifyRotation
*/
public void setLabel(String label) {
fLabel = label;
fRotation = verifyRotation(label, fRotation); // Make sure the current rotation is still legal
recalcDimensions();
}
/**
* Checks for changes to the font on the fComponent
* so that it can invalidate the layout if the size changes
*/
public void propertyChange(PropertyChangeEvent e) {
String prop = e.getPropertyName();
if("font".equals(prop)) {
recalcDimensions();
}
}
/**
* Calculates the dimensions. If they've changed,
* invalidates the component
*/
void recalcDimensions() {
int wOld = getIconWidth();
int hOld = getIconHeight();
calcDimensions();
if (wOld != getIconWidth() || hOld != getIconHeight())
fComponent.invalidate();
}
void calcDimensions() {
FontMetrics fm = fComponent.getFontMetrics(fComponent.getFont());
fCharHeight = fm.getAscent() + fm.getDescent();
fDescent = fm.getDescent();
if (fRotation == ROTATE_NONE) {
int len = fLabel.length();
char data[] = new char[len];
fLabel.getChars(0, len, data, 0);
// if not rotated, width is that of the widest char in the string
fWidth = 0;
// we need an array of one-char strings for drawString
fCharStrings = new String[len];
fCharWidths = new int[len];
fPosition = new int[len];
char ch;
for (int i = 0; i < len; i++) {
ch = data[i];
fCharWidths[i] = fm.charWidth(ch);
if (fCharWidths[i] > fWidth)
fWidth = fCharWidths[i];
fCharStrings[i] = new String(data, i, 1);
// small kana and punctuation
if (sDrawsInTopRight.indexOf(ch) >= 0) // if ch is in sDrawsInTopRight
fPosition[i] = POSITION_TOP_RIGHT;
else if (sDrawsInFarTopRight.indexOf(ch) >= 0)
fPosition[i] = POSITION_FAR_TOP_RIGHT;
else
fPosition[i] = POSITION_NORMAL;
}
// and height is the font height * the char count, + one extra leading at the bottom
fHeight = fCharHeight * len + fDescent;
}
else {
// if rotated, width is the height of the string
fWidth = fCharHeight;
// and height is the width, plus some buffer space
fHeight = fm.stringWidth(fLabel) + 2*kBufferSpace;
}
}
/**
* Draw the icon at the specified location. Icon implementations
* may use the Component argument to get properties useful for
* painting, e.g. the foreground or background color.
*/
public void paintIcon(Component c, Graphics g, int x, int y) {
// We don't insist that it be on the same Component
g.setColor(c.getForeground());
g.setFont(c.getFont());
if (fRotation == ROTATE_NONE) {
int yPos = y + fCharHeight;
for (int i = 0; i < fCharStrings.length; i++) {
// Special rules for Japanese - "half-height" characters (like ya, yu, yo in combinations)
// should draw in the top-right quadrant when drawn vertically
// - they draw in the bottom-left normally
int tweak;
switch (fPosition[i]) {
case POSITION_NORMAL:
// Roman fonts should be centered. Japanese fonts are always monospaced.
g.drawString(fCharStrings[i], x+((fWidth-fCharWidths[i])/2), yPos);
break;
case POSITION_TOP_RIGHT:
tweak = fCharHeight/3; // Should be 2, but they aren't actually half-height
g.drawString(fCharStrings[i], x+(tweak/2), yPos-tweak);
break;
case POSITION_FAR_TOP_RIGHT:
tweak = fCharHeight - fCharHeight/3;
g.drawString(fCharStrings[i], x+(tweak/2), yPos-tweak);
break;
}
yPos += fCharHeight;
}
}
else if (fRotation == ROTATE_LEFT) {
g.translate(x+fWidth,y+fHeight);
((Graphics2D)g).rotate(-NINETY_DEGREES);
g.drawString(fLabel, kBufferSpace, -fDescent);
((Graphics2D)g).rotate(NINETY_DEGREES);
g.translate(-(x+fWidth),-(y+fHeight));
}
else if (fRotation == ROTATE_RIGHT) {
g.translate(x,y);
((Graphics2D)g).rotate(NINETY_DEGREES);
g.drawString(fLabel, kBufferSpace, -fDescent);
((Graphics2D)g).rotate(-NINETY_DEGREES);
g.translate(-x,-y);
}
}
/**
* Returns the icon's width.
*
* @return an int specifying the fixed width of the icon.
*/
public int getIconWidth() {
return fWidth;
}
/**
* Returns the icon's height.
*
* @return an int specifying the fixed height of the icon.
*/
public int getIconHeight() {
return fHeight;
}
/**
verifyRotation
returns the best rotation for the string (ROTATE_NONE, ROTATE_LEFT, ROTATE_RIGHT)
This is public static so you can use it to test a string without creating a VTextIcon
from http://www.unicode.org/unicode/reports/tr9/tr9-3.html
When setting text using the Arabic script in vertical lines,
it is more common to employ a horizontal baseline that
is rotated by 90¡ counterclockwise so that the characters
are ordered from top to bottom. Latin text and numbers
may be rotated 90¡ clockwise so that the characters
are also ordered from top to bottom.
Rotation rules
- Roman can rotate left, right, or none - default right (counterclockwise)
- CJK can't rotate
- Arabic must rotate - default left (clockwise)
from the online edition of _The Unicode Standard, Version 3.0_, file ch10.pdf page 4
Ideographs are found in three blocks of the Unicode Standard...
U+4E00-U+9FFF, U+3400-U+4DFF, U+F900-U+FAFF
Hiragana is U+3040-U+309F, katakana is U+30A0-U+30FF
from http://www.unicode.org/unicode/faq/writingdirections.html
East Asian scripts are frequently written in vertical lines
which run from top-to-bottom and are arrange columns either
from left-to-right (Mongolian) or right-to-left (other scripts).
Most characters use the same shape and orientation when displayed
horizontally or vertically, but many punctuation characters
will change their shape when displayed vertically.
Letters and words from other scripts are generally rotated through
ninety degree angles so that they, too, will read from top to bottom.
That is, letters from left-to-right scripts will be rotated clockwise
and letters from right-to-left scripts counterclockwise, both
through ninety degree angles.
Unlike the bidirectional case, the choice of vertical layout
is usually treated as a formatting style; therefore,
the Unicode Standard does not define default rendering behavior
for vertical text nor provide directionality controls designed to override such behavior
*/
public static int verifyRotation(String label, int rotateHint) {
boolean hasCJK = false;
boolean hasMustRotate = false; // Arabic, etc
int len = label.length();
char data[] = new char[len];
char ch;
label.getChars(0, len, data, 0);
for (int i = 0; i < len; i++) {
ch = data[i];
if ((ch >= '\u4E00' && ch <= '\u9FFF') ||
(ch >= '\u3400' && ch <= '\u4DFF') ||
(ch >= '\uF900' && ch <= '\uFAFF') ||
(ch >= '\u3040' && ch <= '\u309F') ||
(ch >= '\u30A0' && ch <= '\u30FF') )
hasCJK = true;
if ((ch >= '\u0590' && ch <= '\u05FF') || // Hebrew
(ch >= '\u0600' && ch <= '\u06FF') || // Arabic
(ch >= '\u0700' && ch <= '\u074F') ) // Syriac
hasMustRotate = true;
}
// If you mix Arabic with Chinese, you're on your own
if (hasCJK)
return DEFAULT_CJK;
int legal = hasMustRotate ? LEGAL_MUST_ROTATE : LEGAL_ROMAN;
if ((rotateHint & legal) > 0)
return rotateHint;
// The hint wasn't legal, or it was zero
return hasMustRotate ? DEFAULT_MUST_ROTATE : DEFAULT_ROMAN;
}
// The small kana characters and Japanese punctuation that draw in the top right quadrant:
// small a, i, u, e, o, tsu, ya, yu, yo, wa (katakana only) ka ke
static final String sDrawsInTopRight =
"\u3041\u3043\u3045\u3047\u3049\u3063\u3083\u3085\u3087\u308E" + // hiragana
"\u30A1\u30A3\u30A5\u30A7\u30A9\u30C3\u30E3\u30E5\u30E7\u30EE\u30F5\u30F6"; // katakana
static final String sDrawsInFarTopRight = "\u3001\u3002"; // comma, full stop
static final int DEFAULT_CJK = ROTATE_NONE;
static final int LEGAL_ROMAN = ROTATE_NONE | ROTATE_LEFT | ROTATE_RIGHT;
static final int DEFAULT_ROMAN = ROTATE_RIGHT;
static final int LEGAL_MUST_ROTATE = ROTATE_LEFT | ROTATE_RIGHT;
static final int DEFAULT_MUST_ROTATE = ROTATE_LEFT;
static final double NINETY_DEGREES = Math.toRadians(90.0);
static final int kBufferSpace = 5;
}

View File

@ -0,0 +1,90 @@
package enginuity.swing;
import java.io.File;
import java.util.Hashtable;
import java.util.Enumeration;
import javax.swing.*;
import javax.swing.filechooser.*;
public class XMLFilter extends FileFilter {
private static String TYPE_UNKNOWN = "Type Unknown";
private static String HIDDEN_FILE = "Hidden File";
private Hashtable filters = null;
private String description = null;
private String fullDescription = null;
private boolean useExtensionsInDescription = true;
public XMLFilter() {
this.filters = new Hashtable();
this.addExtension("xml");
this.setDescription("ECU Definition Files");
}
public boolean accept(File f) {
if(f != null) {
if(f.isDirectory()) {
return true;
}
String extension = getExtension(f);
if(extension != null && filters.get(getExtension(f)) != null) {
return true;
};
}
return false;
}
public String getExtension(File f) {
if(f != null) {
String filename = f.getName();
int i = filename.lastIndexOf('.');
if(i>0 && i<filename.length()-1) {
return filename.substring(i+1).toLowerCase();
};
}
return null;
}
public void addExtension(String extension) {
if(filters == null) {
filters = new Hashtable(5);
}
filters.put(extension.toLowerCase(), this);
fullDescription = null;
}
public String getDescription() {
if(fullDescription == null) {
if(description == null || isExtensionListInDescription()) {
fullDescription = description==null ? "(" : description + " (";
// build the description from the extension list
Enumeration extensions = filters.keys();
if(extensions != null) {
fullDescription += "." + (String) extensions.nextElement();
while (extensions.hasMoreElements()) {
fullDescription += ", ." + (String) extensions.nextElement();
}
}
fullDescription += ")";
} else {
fullDescription = description;
}
}
return fullDescription;
}
public void setDescription(String description) {
this.description = description;
fullDescription = null;
}
public void setExtensionListInDescription(boolean b) {
useExtensionsInDescription = b;
fullDescription = null;
}
public boolean isExtensionListInDescription() {
return useExtensionsInDescription;
}
}

View File

@ -0,0 +1,326 @@
//DOM XML parser for ROMs
package enginuity.xml;
import enginuity.maps.*;
import enginuity.swing.JProgressPane;
import javax.management.modelmbean.XMLParseException;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DOMRomUnmarshaller {
private JProgressPane progress;
public DOMRomUnmarshaller() { }
public Rom unmarshallXMLDefinition (Node rootNode, byte[] input, JProgressPane progress) throws RomNotFoundException, XMLParseException, StackOverflowError, Exception {
Node n;
NodeList nodes = rootNode.getChildNodes();
this.progress = progress;
for (int i = 0; i < nodes.getLength(); i++) {
n = nodes.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("rom")) {
Node n2;
NodeList nodes2 = n.getChildNodes();
for (int z = 0; z < nodes2.getLength(); z++) {
n2 = nodes2.item(z);
if (n2.getNodeType() == Node.ELEMENT_NODE && n2.getNodeName().equalsIgnoreCase("romid")) {
RomID romID = unmarshallRomID(n2, new RomID());
String ecuID = new String(input, romID.getInternalIdAddress(), romID.getInternalIdString().length());
if (romID.getInternalIdString().equalsIgnoreCase(ecuID) && !ecuID.equalsIgnoreCase("")) {
Rom output = unmarshallRom(n, new Rom());
//set ram offset
output.getRomID().setRamOffset(output.getRomID().getFileSize() - input.length);
return output;
}
}
}
}
}
throw new RomNotFoundException();
}
public Rom unmarshallRom (Node rootNode, Rom rom) throws XMLParseException, RomNotFoundException, StackOverflowError, Exception {
Node n;
NodeList nodes = rootNode.getChildNodes();
progress.update("Creating tables...", 15);
if (!unmarshallAttribute(rootNode, "base", "none").equalsIgnoreCase("none")) {
rom = getBaseRom(rootNode.getParentNode(), unmarshallAttribute(rootNode, "base", "none"), rom);
rom.getRomID().setObsolete(false);
}
for (int i = 0; i < nodes.getLength(); i++) {
n = nodes.item(i);
// update progress
int currProgress = (int)((double)i / (double)nodes.getLength() * 40);
progress.update("Creating tables...", 10 + currProgress);
if (n.getNodeType() == Node.ELEMENT_NODE) {
if (n.getNodeName().equalsIgnoreCase("romid")) {
rom.setRomID(unmarshallRomID(n, rom.getRomID()));
} else if (n.getNodeName().equalsIgnoreCase("table")) {
Table table = null;
try {
table = rom.getTable(unmarshallAttribute(n, "name", "unknown"));
} catch (TableNotFoundException e) { /* table does not already exist (do nothing) */ }
try {
table = unmarshallTable(n, table, rom);
table.setRom(rom);
rom.addTable(table);
} catch (TableIsOmittedException ex) { // table is not supported in inherited def (skip)
rom.removeTable(table.getName());
}
} else { /* unexpected element in Rom (skip)*/ }
} else { /* unexpected node-type in Rom (skip)*/ }
}
return rom;
}
public Rom getBaseRom(Node rootNode, String xmlID, Rom rom) throws XMLParseException, RomNotFoundException, StackOverflowError, Exception {
Node n;
NodeList nodes = rootNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
n = nodes.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("rom")) {
Node n2;
NodeList nodes2 = n.getChildNodes();
for (int z = 0; z < nodes2.getLength(); z++) {
n2 = nodes2.item(z);
if (n2.getNodeType() == Node.ELEMENT_NODE && n2.getNodeName().equalsIgnoreCase("romid")) {
RomID romID = unmarshallRomID(n2, new RomID());
if (romID.getXmlid().equalsIgnoreCase(xmlID)) {
Rom returnrom = unmarshallRom(n, rom);
returnrom.getRomID().setObsolete(false);
return returnrom;
}
}
}
}
}
throw new RomNotFoundException();
}
public RomID unmarshallRomID (Node romIDNode, RomID romID) {
Node n;
NodeList nodes = romIDNode.getChildNodes();
for (int i=0; i < nodes.getLength(); i++){
n = nodes.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE) {
if (n.getNodeName().equalsIgnoreCase("xmlid")){
romID.setXmlid(unmarshallText(n));
} else if (n.getNodeName().equalsIgnoreCase("internalidaddress")) {
romID.setInternalIdAddress(RomAttributeParser.parseHexString(unmarshallText(n)));
} else if (n.getNodeName().equalsIgnoreCase("internalidstring")) {
romID.setInternalIdString(unmarshallText(n));
if (romID.getInternalIdString() == null) romID.setInternalIdString("");
} else if (n.getNodeName().equalsIgnoreCase("caseid")) {
romID.setCaseId(unmarshallText(n));
} else if (n.getNodeName().equalsIgnoreCase("ecuid")) {
romID.setEcuId(unmarshallText(n));
} else if (n.getNodeName().equalsIgnoreCase("make")) {
romID.setMake(unmarshallText(n));
} else if (n.getNodeName().equalsIgnoreCase("market")) {
romID.setMarket(unmarshallText(n));
} else if (n.getNodeName().equalsIgnoreCase("model")) {
romID.setModel(unmarshallText(n));
} else if (n.getNodeName().equalsIgnoreCase("submodel")) {
romID.setSubModel(unmarshallText(n));
} else if (n.getNodeName().equalsIgnoreCase("transmission")) {
romID.setTransmission(unmarshallText(n));
} else if (n.getNodeName().equalsIgnoreCase("year")) {
romID.setYear(Integer.parseInt(unmarshallText(n)));
} else if (n.getNodeName().equalsIgnoreCase("flashmethod")) {
romID.setFlashMethod(unmarshallText(n));
} else if (n.getNodeName().equalsIgnoreCase("memmodel")) {
romID.setMemModel(unmarshallText(n));
} else if (n.getNodeName().equalsIgnoreCase("filesize")) {
romID.setFileSize(RomAttributeParser.parseFileSize(unmarshallText(n)));
} else if (n.getNodeName().equalsIgnoreCase("obsolete")) {
romID.setObsolete(Boolean.parseBoolean(unmarshallText(n)));
} else { /* unexpected element in RomID (skip) */ }
} else { /* unexpected node-type in RomID (skip) */ }
}
return romID;
}
private Table copyTable(Table input) {
Table output = input;
return output;
}
private Table unmarshallTable(Node tableNode, Table table, Rom rom) throws XMLParseException, TableIsOmittedException, Exception {
if (unmarshallAttribute(tableNode, "omit", "false").equalsIgnoreCase("true")) {
throw new TableIsOmittedException();
}
if (!unmarshallAttribute(tableNode, "base", "none").equalsIgnoreCase("none")) {
try {
table = (Table)ObjectCloner.deepCopy((Object)rom.getTable(unmarshallAttribute(tableNode, "base", "none")));
} catch (TableNotFoundException ex) { /* table not found */ } catch (NullPointerException ex) {
ex.printStackTrace();
}
}
try {
if (table.getType() < 1) { }
} catch (NullPointerException ex) { // if type is null or less than 0, create new instance (otherwise it is inherited)
if (unmarshallAttribute(tableNode, "type", "unknown").equalsIgnoreCase("3D")) {
table = new Table3D();
} else if (unmarshallAttribute(tableNode, "type", "unknown").equalsIgnoreCase("2D")) {
table = new Table2D();
} else if (unmarshallAttribute(tableNode, "type", "unknown").equalsIgnoreCase("1D")) {
table = new Table1D();
} else if (unmarshallAttribute(tableNode, "type", "unknown").equalsIgnoreCase("X Axis") ||
unmarshallAttribute(tableNode, "type", "unknown").equalsIgnoreCase("Y Axis")) {
table = new Table1D();
} else if (unmarshallAttribute(tableNode, "type", "unknown").equalsIgnoreCase("Static Y Axis") ||
unmarshallAttribute(tableNode, "type", "unknown").equalsIgnoreCase("Static X Axis")) {
table = new Table1D();
} else {
throw new XMLParseException();
}
}
table.setName(unmarshallAttribute(tableNode, "name", table.getName()));
table.setType(RomAttributeParser.parseTableType(unmarshallAttribute(tableNode, "type", table.getType())));
if (unmarshallAttribute(tableNode, "beforeram", "false").equalsIgnoreCase("true")) table.setBeforeRam(true);
if (unmarshallAttribute(tableNode, "type", "unknown").equalsIgnoreCase("Static X Axis") ||
unmarshallAttribute(tableNode, "type", "unknown").equalsIgnoreCase("Static Y Axis")) {
table.setIsStatic(true);
((Table1D)table).setIsAxis(true);
} else if (unmarshallAttribute(tableNode, "type", "unknown").equalsIgnoreCase("X Axis") ||
unmarshallAttribute(tableNode, "type", "unknown").equalsIgnoreCase("Y Axis")) {
((Table1D)table).setIsAxis(true);
}
table.setCategory(unmarshallAttribute(tableNode, "category", table.getCategory()));
table.setStorageType(RomAttributeParser.parseStorageType(unmarshallAttribute(tableNode, "storagetype", table.getStorageType())));
table.setEndian(RomAttributeParser.parseEndian(unmarshallAttribute(tableNode, "endian", table.getEndian())));
table.setStorageAddress(RomAttributeParser.parseHexString(unmarshallAttribute(tableNode, "storageaddress", table.getStorageAddress())));
//table.setDescription(unmarshallAttribute(tableNode, "description", table.getDescription()));
table.setDataSize(Integer.parseInt(unmarshallAttribute(tableNode, "sizey", unmarshallAttribute(tableNode, "sizex", table.getDataSize()))));
table.setFlip(Boolean.parseBoolean(unmarshallAttribute(tableNode, "flipy", unmarshallAttribute(tableNode, "flipx", table.getFlip()+""))));
if (table.getType() == Table.TABLE_3D) {
((Table3D)table).setFlipX(Boolean.parseBoolean(unmarshallAttribute(tableNode, "flipx", ((Table3D)table).getFlipX()+"")));
((Table3D)table).setFlipY(Boolean.parseBoolean(unmarshallAttribute(tableNode, "flipy", ((Table3D)table).getFlipY()+"")));
((Table3D)table).setSizeX(Integer.parseInt(unmarshallAttribute(tableNode, "sizex", ((Table3D)table).getSizeX())));
((Table3D)table).setSizeY(Integer.parseInt(unmarshallAttribute(tableNode, "sizey", ((Table3D)table).getSizeY())));
}
Node n;
NodeList nodes = tableNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
n = nodes.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE) {
if (n.getNodeName().equalsIgnoreCase("table")) {
if (table.getType() == Table.TABLE_2D) {
if (RomAttributeParser.parseTableType(unmarshallAttribute(n, "type", "unknown")) == Table.TABLE_Y_AXIS ||
RomAttributeParser.parseTableType(unmarshallAttribute(n, "type", "unknown")) == Table.TABLE_X_AXIS) {
Table1D tempTable = (Table1D)unmarshallTable(n, ((Table2D)table).getAxis(), rom);
if (tempTable.getDataSize() != table.getDataSize()) tempTable.setDataSize(table.getDataSize());
tempTable.setData(((Table2D)table).getAxis().getData());
tempTable.setAxisParent(table);
((Table2D)table).setAxis(tempTable);
}
} else if (table.getType() == Table.TABLE_3D) {
if (RomAttributeParser.parseTableType(unmarshallAttribute(n, "type", "unknown")) == Table.TABLE_X_AXIS) {
Table1D tempTable = (Table1D)unmarshallTable(n, ((Table3D)table).getXAxis(), rom);
if (tempTable.getDataSize() != ((Table3D)table).getSizeX()) tempTable.setDataSize(((Table3D)table).getSizeX());
tempTable.setData(((Table3D)table).getXAxis().getData());
tempTable.setAxisParent(table);
((Table3D)table).setXAxis(tempTable);
} else if (RomAttributeParser.parseTableType(unmarshallAttribute(n, "type", "unknown")) == Table.TABLE_Y_AXIS) {
Table1D tempTable = (Table1D)unmarshallTable(n, ((Table3D)table).getYAxis(), rom);
if (tempTable.getDataSize() != ((Table3D)table).getSizeY()) tempTable.setDataSize(((Table3D)table).getSizeY());
tempTable.setData(((Table3D)table).getYAxis().getData());
tempTable.setAxisParent(table);
((Table3D)table).setYAxis(tempTable);
}
}
} else if (n.getNodeName().equalsIgnoreCase("scaling")) {
table.setScale(unmarshallScale(n, table.getScale()));
} else if (n.getNodeName().equalsIgnoreCase("data")) {
// parse and add data to table
DataCell dataCell = new DataCell();
dataCell.setDisplayValue(unmarshallText(n));
dataCell.setTable(table);
((Table1D)table).addStaticDataCell(dataCell);
} else if (n.getNodeName().equalsIgnoreCase("description")) {
table.setDescription(unmarshallText(n));
} else { /*unexpected element in Table (skip) */ }
} else { /* unexpected node-type in Table (skip) */ }
}
return table;
}
private Scale unmarshallScale (Node scaleNode, Scale scale) {
scale.setUnit(unmarshallAttribute(scaleNode, "units", scale.getUnit()));
scale.setExpression(unmarshallAttribute(scaleNode, "expression", scale.getExpression()));
scale.setByteExpression(unmarshallAttribute(scaleNode, "to_byte", scale.getByteExpression()));
scale.setFormat(unmarshallAttribute(scaleNode, "format", "#"));
scale.setIncrement(Integer.parseInt(unmarshallAttribute(scaleNode, "increment", scale.getIncrement())));
return scale;
}
private String unmarshallText(Node textNode) {
StringBuffer buf = new StringBuffer();
Node n;
NodeList nodes = textNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++){
n = nodes.item(i);
if (n.getNodeType() == Node.TEXT_NODE) {
buf.append(n.getNodeValue());
} else {
// expected a text-only node (skip)
}
}
return buf.toString();
}
private String unmarshallAttribute(Node node, String name, String defaultValue) {
Node n = node.getAttributes().getNamedItem(name);
return (n!=null)?(n.getNodeValue()):(defaultValue);
}
private String unmarshallAttribute(Node node, String name, int defaultValue) {
return unmarshallAttribute(node, name, defaultValue+"");
}
}

View File

@ -0,0 +1,184 @@
package enginuity.xml;
import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
import enginuity.Settings;
import enginuity.swing.JProgressPane;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.metadata.IIOMetadataNode;
public class DOMSettingsBuilder {
public void buildSettings (Settings settings, File output, JProgressPane progress) throws IOException {
IIOMetadataNode settingsNode = new IIOMetadataNode("settings");
// create settings
progress.update("Saving window settings...", 15);
settingsNode.appendChild(buildWindow(settings));
progress.update("Saving URL settings...", 30);
settingsNode.appendChild(buildURLs(settings));
progress.update("Saving file settings...", 45);
settingsNode.appendChild(buildFiles(settings));
progress.update("Saving options...", 60);
settingsNode.appendChild(buildOptions(settings));
progress.update("Saving display settings...", 75);
settingsNode.appendChild(buildTableDisplay(settings));
OutputFormat of = new OutputFormat("XML","ISO-8859-1",true);
of.setIndent(1);
of.setIndenting(true);
progress.update("Writing to file...", 90);
FileOutputStream fos = new FileOutputStream(output);
XMLSerializer serializer = new XMLSerializer(fos,of);
serializer.serialize(settingsNode);
fos.flush();
fos.close();
}
public IIOMetadataNode buildWindow(Settings settings) {
IIOMetadataNode windowSettings = new IIOMetadataNode("window");
// window size
IIOMetadataNode size = new IIOMetadataNode("size");
size.setAttribute("x", ((int)settings.getWindowSize().getHeight())+"");
size.setAttribute("y", ((int)settings.getWindowSize().getWidth())+"");
windowSettings.appendChild(size);
// window location
IIOMetadataNode location = new IIOMetadataNode("location");
location.setAttribute("x", ((int)settings.getWindowLocation().getX())+"");
location.setAttribute("y", ((int)settings.getWindowLocation().getY())+"");
windowSettings.appendChild(location);
// splitpane location
IIOMetadataNode splitpane = new IIOMetadataNode("splitpane");
splitpane.setAttribute("location", settings.getSplitPaneLocation()+"");
windowSettings.appendChild(splitpane);
return windowSettings;
}
public IIOMetadataNode buildURLs(Settings settings) {
IIOMetadataNode urls = new IIOMetadataNode("urls");
// rom revision url
IIOMetadataNode romRevision = new IIOMetadataNode("romrevision");
romRevision.setAttribute("url", settings.getRomRevisionURL());
urls.appendChild(romRevision);
// support url
IIOMetadataNode support = new IIOMetadataNode("support");
support.setAttribute("url", settings.getSupportURL());
urls.appendChild(support);
return urls;
}
public IIOMetadataNode buildFiles(Settings settings) {
IIOMetadataNode files = new IIOMetadataNode("files");
// image directory
IIOMetadataNode imageDir = new IIOMetadataNode("image_dir");
imageDir.setAttribute("path", settings.getLastImageDir().getAbsolutePath());
files.appendChild(imageDir);
// ecu definition files
// need to code this again after allowing more
IIOMetadataNode ecuDef = new IIOMetadataNode("ecudefinitionfile");
ecuDef.setAttribute("name", settings.getEcuDefinitionFile().getAbsolutePath());
files.appendChild(ecuDef);
return files;
}
public IIOMetadataNode buildOptions(Settings settings) {
IIOMetadataNode options = new IIOMetadataNode("options");
// obsolete warning
IIOMetadataNode obsoleteWarning = new IIOMetadataNode("obsoletewarning");
obsoleteWarning.setAttribute("value", settings.isObsoleteWarning()+"");
options.appendChild(obsoleteWarning);
// calcultion conflicting warning
IIOMetadataNode calcConflictWarning = new IIOMetadataNode("calcconflictwarning");
calcConflictWarning.setAttribute("value", settings.isCalcConflictWarning()+"");
options.appendChild(calcConflictWarning);
// debug mode
IIOMetadataNode debug = new IIOMetadataNode("debug");
debug.setAttribute("value", settings.isDebug()+"");
options.appendChild(debug);
return options;
}
public IIOMetadataNode buildTableDisplay(Settings settings) {
IIOMetadataNode tableDisplay = new IIOMetadataNode("tabledisplay");
// font
IIOMetadataNode font = new IIOMetadataNode("font");
font.setAttribute("face", settings.getTableFont().getName());
font.setAttribute("size", settings.getTableFont().getSize()+"");
font.setAttribute("decoration", settings.getTableFont().getStyle()+"");
tableDisplay.appendChild(font);
// table cell size
IIOMetadataNode cellSize = new IIOMetadataNode("cellsize");
cellSize.setAttribute("height", ((int)settings.getCellSize().getHeight())+"");
cellSize.setAttribute("width", ((int)settings.getCellSize().getWidth())+"");
tableDisplay.appendChild(cellSize);
// colors
IIOMetadataNode colors = new IIOMetadataNode("colors");
// max
IIOMetadataNode max = new IIOMetadataNode("max");
max.setAttribute("r", settings.getMaxColor().getRed()+"");
max.setAttribute("g", settings.getMaxColor().getGreen()+"");
max.setAttribute("b", settings.getMaxColor().getBlue()+"");
colors.appendChild(max);
// min
IIOMetadataNode min = new IIOMetadataNode("min");
min.setAttribute("r", settings.getMinColor().getRed()+"");
min.setAttribute("g", settings.getMinColor().getGreen()+"");
min.setAttribute("b", settings.getMinColor().getBlue()+"");
colors.appendChild(min);
// highlight
IIOMetadataNode highlight = new IIOMetadataNode("highlight");
highlight.setAttribute("r", settings.getHighlightColor().getRed()+"");
highlight.setAttribute("g", settings.getHighlightColor().getGreen()+"");
highlight.setAttribute("b", settings.getHighlightColor().getBlue()+"");
colors.appendChild(highlight);
// increased cell border
IIOMetadataNode increaseBorder = new IIOMetadataNode("increaseborder");
increaseBorder.setAttribute("r", settings.getIncreaseBorder().getRed()+"");
increaseBorder.setAttribute("g", settings.getIncreaseBorder().getGreen()+"");
increaseBorder.setAttribute("b", settings.getIncreaseBorder().getBlue()+"");
colors.appendChild(increaseBorder);
// decreased cell border
IIOMetadataNode decreaseBorder = new IIOMetadataNode("decreaseborder");
decreaseBorder.setAttribute("r", settings.getDecreaseBorder().getRed()+"");
decreaseBorder.setAttribute("g", settings.getDecreaseBorder().getGreen()+"");
decreaseBorder.setAttribute("b", settings.getDecreaseBorder().getBlue()+"");
colors.appendChild(decreaseBorder);
// axis cells
IIOMetadataNode axis = new IIOMetadataNode("axis");
axis.setAttribute("r", settings.getAxisColor().getRed()+"");
axis.setAttribute("g", settings.getAxisColor().getGreen()+"");
axis.setAttribute("b", settings.getAxisColor().getBlue()+"");
colors.appendChild(axis);
tableDisplay.appendChild(colors);
// single table view
IIOMetadataNode singleTable = new IIOMetadataNode("singletableview");
singleTable.setAttribute("value", settings.isSingleTableView()+"");
tableDisplay.appendChild(singleTable);
return tableDisplay;
}
}

View File

@ -0,0 +1,213 @@
package enginuity.xml;
import com.sun.org.apache.xerces.internal.parsers.DOMParser;
import enginuity.Settings;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Point;
import java.io.File;
import java.io.FileInputStream;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
public class DOMSettingsUnmarshaller {
public Settings unmarshallSettings (Node rootNode) {
Settings settings = new Settings();
Node n;
NodeList nodes = rootNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
n = nodes.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("window")) {
settings = unmarshallWindow(n, settings);
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("urls")) {
settings = unmarshallURLs(n, settings);
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("options")) {
settings = unmarshallOptions(n, settings);
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("files")) {
settings = unmarshallFiles(n, settings);
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("tabledisplay")) {
settings = unmarshallTableDisplay(n, settings);
}
}
return settings;
}
public Settings unmarshallWindow (Node windowNode, Settings settings) {
Node n;
NodeList nodes = windowNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
n = nodes.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("size")) {
settings.setWindowSize(new Dimension(unmarshallAttribute(n, "y", 600),
unmarshallAttribute(n, "x", 800)));
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("location")) {
// set default location in center of screen
Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
Point location = new Point(((int)(screenSize.getWidth() - settings.getWindowSize().getWidth()) / 2),
((int)(screenSize.getHeight() - settings.getWindowSize().getHeight()) / 2));
settings.setWindowLocation(new Point(unmarshallAttribute(n, "x", 0),
unmarshallAttribute(n, "y", 0)));
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("splitpane")) {
settings.setSplitPaneLocation(unmarshallAttribute(n, "location", 150));
}
}
return settings;
}
public Settings unmarshallURLs (Node urlNode, Settings settings) {
Node n;
NodeList nodes = urlNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
n = nodes.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("romrevision")) {
settings.setRomRevisionURL(unmarshallAttribute(n, "url",
"http://www.scoobypedia.co.uk/index.php/Knowledge/ECUVersionCompatibilityList"));
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("support")) {
settings.setSupportURL(unmarshallAttribute(n, "url", "http://www.enginuity.org"));
}
}
return settings;
}
public Settings unmarshallFiles (Node urlNode, Settings settings) {
Node n;
NodeList nodes = urlNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
n = nodes.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("ecudefinitionfile")) {
settings.addEcuDefinitionFile(new File(unmarshallAttribute(n, "name", "ecu_defs.xml")));
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("image_dir")) {
settings.setLastImageDir(new File(unmarshallAttribute(n, "path", "ecu_defs.xml")));
}
}
return settings;
}
public Settings unmarshallOptions (Node optionNode, Settings settings) {
Node n;
NodeList nodes = optionNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
n = nodes.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("obsoletewarning")) {
settings.setObsoleteWarning(Boolean.parseBoolean(unmarshallAttribute(n, "value", "true")));
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("debug")) {
settings.setDebug(Boolean.parseBoolean(unmarshallAttribute(n, "value", "true")));
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("calcconflictwarning")) {
settings.setCalcConflictWarning(Boolean.parseBoolean(unmarshallAttribute(n, "value", "true")));
}
}
return settings;
}
public Settings unmarshallTableDisplay (Node tableDisplayNode, Settings settings) {
Node n;
NodeList nodes = tableDisplayNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
n = nodes.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("font")) {
settings.setTableFont(new Font(unmarshallAttribute(n, "face", "Arial"),
unmarshallAttribute(n, "decoration", Font.BOLD),
unmarshallAttribute(n, "size", 12)));
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("cellsize")) {
settings.setCellSize(new Dimension(unmarshallAttribute(n, "x", 42),
unmarshallAttribute(n, "y", 18)));
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("colors")) {
settings = unmarshallColors(n, settings);
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("singletableview")) {
settings.setDebug(unmarshallAttribute(n, "value", true));
}
}
return settings;
}
public Settings unmarshallColors(Node colorNode, Settings settings) {
Node n;
NodeList nodes = colorNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
n = nodes.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("max")) {
settings.setMaxColor(unmarshallColor(n));
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("min")) {
settings.setMinColor(unmarshallColor(n));
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("highlight")) {
settings.setHighlightColor(unmarshallColor(n));
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("increaseborder")) {
settings.setIncreaseBorder(unmarshallColor(n));
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("decreaseborder")) {
settings.setDecreaseBorder(unmarshallColor(n));
} else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("axis")) {
settings.setAxisColor(unmarshallColor(n));
}
}
return settings;
}
public Color unmarshallColor(Node colorNode) {
return new Color(unmarshallAttribute(colorNode, "r", 155),
unmarshallAttribute(colorNode, "g", 155),
unmarshallAttribute(colorNode, "b", 155));
}
private String unmarshallText(Node textNode) {
StringBuffer buf = new StringBuffer();
Node n;
NodeList nodes = textNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++){
n = nodes.item(i);
if (n.getNodeType() == Node.TEXT_NODE) {
buf.append(n.getNodeValue());
} else {
// expected a text-only node (skip)
}
}
return buf.toString();
}
private String unmarshallAttribute(Node node, String name, String defaultValue) {
Node n = node.getAttributes().getNamedItem(name);
return (n!=null)?(n.getNodeValue()):(defaultValue);
}
private Double unmarshallAttribute(Node node, String name, double defaultValue) {
return Double.parseDouble(unmarshallAttribute(node, name, defaultValue+""));
}
private int unmarshallAttribute(Node node, String name, int defaultValue) {
return Integer.parseInt(unmarshallAttribute(node, name, defaultValue+""));
}
private boolean unmarshallAttribute(Node node, String name, boolean defaultValue) {
return Boolean.parseBoolean(unmarshallAttribute(node, name, defaultValue+""));
}
}

View File

@ -0,0 +1,38 @@
package enginuity.xml;
import java.io.*;
public class ObjectCloner {
// so that nobody can accidentally create an ObjectCloner object
private ObjectCloner(){}
// returns a deep copy of an object
static public Object deepCopy(Object oldObj) throws Exception
{
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try
{
ByteArrayOutputStream bos =
new ByteArrayOutputStream(); // A
oos = new ObjectOutputStream(bos); // B
// serialize and pass the object
oos.writeObject(oldObj); // C
oos.flush(); // D
ByteArrayInputStream bin =
new ByteArrayInputStream(bos.toByteArray()); // E
ois = new ObjectInputStream(bin); // F
// return the new object
return ois.readObject(); // G
}
catch(Exception e)
{
System.out.println("Exception in ObjectCloner = " + e);
throw(e);
}
finally
{
oos.close();
ois.close();
}
}
}

View File

@ -0,0 +1,115 @@
// Parses attributes from ROM XML
package enginuity.xml;
import enginuity.maps.Table;
import enginuity.maps.Scale;
public abstract class RomAttributeParser {
public RomAttributeParser() {
}
public static int parseEndian(String input) {
if (input.equalsIgnoreCase("big") || input.equalsIgnoreCase(Table.ENDIAN_BIG+"")) {
return Table.ENDIAN_BIG;
} else if (input.equalsIgnoreCase("little") || input.equalsIgnoreCase(Table.ENDIAN_LITTLE+"")) {
return Table.ENDIAN_LITTLE;
} else {
return Table.ENDIAN_LITTLE;
}
}
public static int parseHexString(String input) {
if (input.equals("0")) return 0;
else if (input.length() > 2 && input.substring(0,2).equalsIgnoreCase("0x")) {
return Integer.parseInt(input.substring(2), 16);
} else {
return Integer.parseInt(input, 16);
}
}
public static int parseStorageType(String input) {
try {
return Integer.parseInt(input.substring(4)) / 8;
} catch (Exception ex) {
return Integer.parseInt(input);
}
}
public static int parseScaleType(String input) {
if (input.equalsIgnoreCase("inverse")) {
return Scale.INVERSE;
} else {
return Scale.LINEAR;
}
}
public static int parseTableType(String input) {
if (input.equalsIgnoreCase("3D") || input.equalsIgnoreCase(Table.TABLE_3D+"")) {
return Table.TABLE_3D;
} else if (input.equalsIgnoreCase("2D") || input.equalsIgnoreCase(Table.TABLE_2D+"")) {
return Table.TABLE_2D;
} else if (input.equalsIgnoreCase("X Axis") || input.equalsIgnoreCase("Static X Axis") || input.equalsIgnoreCase(Table.TABLE_X_AXIS+"")) {
return Table.TABLE_X_AXIS;
} else if (input.equalsIgnoreCase("Y Axis") || input.equalsIgnoreCase("Static Y Axis") || input.equalsIgnoreCase(Table.TABLE_Y_AXIS+"")) {
return Table.TABLE_Y_AXIS;
} else {
return Table.TABLE_1D;
}
}
public static int parseByteValue(byte[] input, int endian, int address, int length) throws ArrayIndexOutOfBoundsException {
try {
int output = 0;
if (endian == Table.ENDIAN_BIG) {
for (int i = 0; i < length; i++) {
output += (input[address + i] & 0xff) << 8 * (length - i - 1);
}
} else { // little endian
for (int i = 0; i < length; i++) {
output += (input[address + length - i - 1] & 0xff) << 8 * (length - i - 1);
}
}
return output;
} catch (ArrayIndexOutOfBoundsException ex) {
throw new ArrayIndexOutOfBoundsException();
}
}
public static byte[] parseIntegerValue(int input, int endian, int length) {
byte[] byteArray = new byte[4];
byteArray[0] = (byte)((input >> 24) & 0x000000FF);
byteArray[1] = (byte)((input >> 16) & 0x0000FF);
byteArray[2] = (byte)((input >> 8) & 0x00FF);
byteArray[3] = (byte)(input & 0xFF );
byte[] output = new byte[length];
for (int i = 0; i < length; i++) {
if (endian == Table.ENDIAN_BIG) {
//output[i] = byteArray[i + length];
output[i] = byteArray[4 - length + i];
} else { // little endian
output[length - 1 - i] = byteArray[4 - length + i];
}
}
return output;
}
public static int parseFileSize(String input) throws NumberFormatException {
try {
return Integer.parseInt(input);
} catch (NumberFormatException ex) {
if (input.substring(input.length() - 2).equalsIgnoreCase("kb")) {
return Integer.parseInt(input.substring(0, input.length() - 2)) * 1024;
} else if (input.substring(input.length() - 2).equalsIgnoreCase("mb")) {
return Integer.parseInt(input.substring(0, input.length() - 2)) * 1024 * 1024;
}
throw new NumberFormatException();
}
}
//public static boolean parseBoolean
}

View File

@ -0,0 +1,7 @@
package enginuity.xml;
public class RomNotFoundException extends Exception {
public RomNotFoundException() {
}
}

View File

@ -0,0 +1,6 @@
package enginuity.xml;
public class TableIsOmittedException extends Exception {
public TableIsOmittedException() { }
}

View File

@ -0,0 +1,3 @@
package enginuity.xml;
public class TableNotFoundException extends Exception { }