/*
* RomRaider Open-Source Tuning, Logging and Reflashing
* Copyright (C) 2006-2016 RomRaider.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package com.romraider.maps;
import java.awt.BorderLayout;
import javax.swing.JLabel;
import com.romraider.Settings;
import com.romraider.util.NumberUtil;
public class Table1D extends Table {
private static final long serialVersionUID = -8747180767803835631L;
private Table axisParent = null;
public Table1D() {
super();
}
public void setAxisParent(Table axisParent) {
this.axisParent = axisParent;
}
public Table getAxisParent() {
return axisParent;
}
public void addStaticDataCell(DataCell input) {
for(int i = 0; i < data.length; i++) {
if(data[i] == null) {
data[i] = input;
data[i].setY(i);
break;
}
}
}
@Override
public void populateTable(byte[] input, int romRamOffset) throws ArrayIndexOutOfBoundsException, IndexOutOfBoundsException {
centerLayout.setRows(1);
centerLayout.setColumns(this.getDataSize());
super.populateTable(input, romRamOffset);
// add to table
for (int i = 0; i < this.getDataSize(); i++) {
centerPanel.add(this.getDataCell(i));
}
if(null == name || name.isEmpty()) {
;// Do not add label.
} else if(null == getCurrentScale () || "0x" == getCurrentScale().getUnit()) {
// static or no scale exists.
tableLabel = new JLabel(getName(), JLabel.CENTER);
add(tableLabel, BorderLayout.NORTH);
} else {
tableLabel = new JLabel(getName() + " (" + getCurrentScale().getUnit() + ")", JLabel.CENTER);
add(tableLabel, BorderLayout.NORTH);
}
}
@Override
public String toString() {
return super.toString() + " (1D)";
}
@Override
public void cursorUp() {
if (type == Settings.TABLE_Y_AXIS) {
if (highlightY > 0 && data[highlightY].isSelected()) {
selectCellAt(highlightY - 1);
}
} else if (type == Settings.TABLE_X_AXIS) {
// Y axis is on top.. nothing happens
} else if (type == Settings.TABLE_1D) {
// no where to move up to
}
}
@Override
public void cursorDown() {
if (type == Settings.TABLE_Y_AXIS) {
if (getAxisParent().getType() == Settings.TABLE_3D) {
if (highlightY < getDataSize() - 1 && data[highlightY].isSelected()) {
selectCellAt(highlightY + 1);
}
} else if (getAxisParent().getType() == Settings.TABLE_2D) {
if (data[highlightY].isSelected()) {
getAxisParent().selectCellAt(highlightY);
}
}
} else if (type == Settings.TABLE_X_AXIS && data[highlightY].isSelected()) {
((Table3D) getAxisParent()).selectCellAt(highlightY, this);
} else if (type == Settings.TABLE_1D) {
// no where to move down to
}
}
@Override
public void cursorLeft() {
if (type == Settings.TABLE_Y_AXIS) {
// X axis is on left.. nothing happens
if (getAxisParent().getType() == Settings.TABLE_2D) {
if (data[highlightY].isSelected()) {
selectCellAt(highlightY - 1);
}
}
} else if (type == Settings.TABLE_X_AXIS && data[highlightY].isSelected()) {
if (highlightY > 0) {
selectCellAt(highlightY - 1);
}
} else if (type == Settings.TABLE_1D && data[highlightY].isSelected()) {
if (highlightY > 0) {
selectCellAt(highlightY - 1);
}
}
}
@Override
public void cursorRight() {
if (type == Settings.TABLE_Y_AXIS && data[highlightY].isSelected()) {
if (getAxisParent().getType() == Settings.TABLE_3D) {
((Table3D) getAxisParent()).selectCellAt(highlightY, this);
} else if (getAxisParent().getType() == Settings.TABLE_2D) {
selectCellAt(highlightY + 1);
}
} else if (type == Settings.TABLE_X_AXIS && data[highlightY].isSelected()) {
if (highlightY < getDataSize() - 1) {
selectCellAt(highlightY + 1);
}
} else if (type == Settings.TABLE_1D && data[highlightY].isSelected()) {
if (highlightY < getDataSize() - 1) {
selectCellAt(highlightY + 1);
}
}
}
@Override
public void shiftCursorUp() {
if (type == Settings.TABLE_Y_AXIS) {
if (highlightY > 0 && data[highlightY].isSelected()) {
selectCellAtWithoutClear(highlightY - 1);
}
} else if (type == Settings.TABLE_X_AXIS) {
// Y axis is on top.. nothing happens
} else if (type == Settings.TABLE_1D) {
// no where to move up to
}
}
@Override
public void shiftCursorDown() {
if (type == Settings.TABLE_Y_AXIS) {
if (getAxisParent().getType() == Settings.TABLE_3D) {
if (highlightY < getDataSize() - 1 && data[highlightY].isSelected()) {
selectCellAtWithoutClear(highlightY + 1);
}
} else if (getAxisParent().getType() == Settings.TABLE_2D) {
if (data[highlightY].isSelected()) {
getAxisParent().selectCellAtWithoutClear(highlightY);
}
}
} else if (type == Settings.TABLE_X_AXIS && data[highlightY].isSelected()) {
((Table3D) getAxisParent()).selectCellAt(highlightY, this);
} else if (type == Settings.TABLE_1D) {
// no where to move down to
}
}
@Override
public void shiftCursorLeft() {
if (type == Settings.TABLE_Y_AXIS) {
// X axis is on left.. nothing happens
if (getAxisParent().getType() == Settings.TABLE_2D) {
if (data[highlightY].isSelected()) {
selectCellAtWithoutClear(highlightY - 1);
}
}
} else if (type == Settings.TABLE_X_AXIS && data[highlightY].isSelected()) {
if (highlightY > 0) {
selectCellAtWithoutClear(highlightY - 1);
}
} else if (type == Settings.TABLE_1D && data[highlightY].isSelected()) {
if (highlightY > 0) {
selectCellAtWithoutClear(highlightY - 1);
}
}
}
@Override
public void shiftCursorRight() {
if (type == Settings.TABLE_Y_AXIS && data[highlightY].isSelected()) {
if (getAxisParent().getType() == Settings.TABLE_3D) {
((Table3D) getAxisParent()).selectCellAt(highlightY, this);
} else if (getAxisParent().getType() == Settings.TABLE_2D) {
selectCellAtWithoutClear(highlightY + 1);
}
} else if (type == Settings.TABLE_X_AXIS && data[highlightY].isSelected()) {
if (highlightY < getDataSize() - 1) {
selectCellAtWithoutClear(highlightY + 1);
}
} else if (type == Settings.TABLE_1D && data[highlightY].isSelected()) {
if (highlightY < getDataSize() - 1) {
selectCellAtWithoutClear(highlightY + 1);
}
}
}
@Override
public void clearSelection() {
// Call to the axis parent. The axis parent should then call to clear this data.
getAxisParent().clearSelection();
}
@Override
public void startHighlight(int x, int y) {
Table axisParent = getAxisParent();
axisParent.clearSelectedData();
if(axisParent instanceof Table3D) {
Table3D table3D = (Table3D) axisParent;
if(getType() == Settings.TABLE_X_AXIS) {
table3D.getYAxis().clearSelectedData();
} else if (getType() == Settings.TABLE_Y_AXIS) {
table3D.getXAxis().clearSelectedData();
}
} else if (axisParent instanceof Table2D) {
((Table2D) axisParent).getAxis().clearSelectedData();
}
super.startHighlight(x, y);
}
@Override
public String getCellAsString(int index) {
return data[index].getText();
}
@Override
public void highlightLiveData(String liveVal) {
if (getOverlayLog()) {
double liveValue = 0.0;
try {
liveValue = NumberUtil.doubleValue(liveVal);
} catch (Exception ex) {
LOGGER.error("Table1D - live data highlight parsing error for value: " + liveVal);
return;
}
int startIdx = data.length;
for (int i = 0; i < data.length; i++) {
double currentValue = 0.0;
if(isStaticDataTable() && null != data[i].getStaticText()) {
try {
currentValue = Double.parseDouble(data[i].getStaticText());
} catch(NumberFormatException nex) {
return;
}
} else {
currentValue = data[i].getRealValue();
}
if (liveValue == currentValue) {
startIdx = i;
break;
} else if (liveValue < currentValue){
startIdx = i-1;
break;
}
}
setLiveDataIndex(startIdx);
DataCell cell = data[getLiveDataIndex()];
cell.setLiveDataTrace(true);
cell.setLiveDataTraceValue(liveVal);
getToolbar().setLiveDataValue(liveVal);
}
getAxisParent().updateLiveDataHighlight();
}
@Override
public boolean isLiveDataSupported() {
return false;
}
@Override
public boolean isButtonSelected() {
return true;
}
public boolean isAxis() {
return getType() == Settings.TABLE_X_AXIS ||
getType() == Settings.TABLE_Y_AXIS || isStaticDataTable();
}
@Override
public boolean equals(Object other) {
try {
if(null == other) {
return false;
}
if(other == this) {
return true;
}
if(!(other instanceof Table1D)) {
return false;
}
Table1D otherTable = (Table1D)other;
if(this.isAxis() != otherTable.isAxis()) {
return false;
}
if(this.data.length != otherTable.data.length)
{
return false;
}
if(this.data.equals(otherTable.data))
{
return true;
}
// Compare Bin Values
for(int i=0 ; i < this.data.length ; i++) {
if(! this.data[i].equals(otherTable.data[i])) {
return false;
}
}
return true;
} catch(Exception ex) {
// TODO: Log Exception.
return false;
}
}
@Override
public void updateTableLabel() {
this.getAxisParent().updateTableLabel();
}
@Override
public StringBuffer getTableAsString() {
if(isStaticDataTable()) {
StringBuffer output = new StringBuffer(Settings.BLANK);
for (int i = 0; i < data.length; i++) {
output.append(data[i].getStaticText());
if (i < data.length - 1) {
output.append(Settings.TAB);
}
}
return output;
} else {
return super.getTableAsString();
}
}
}