package org.nwapw.abacus.window;

import org.nwapw.abacus.tree.TreeNode;

import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import java.util.ArrayList;

public class HistoryTableModel extends AbstractTableModel {

    public static final String[] COLUMN_NAMES = {
            "Input",
            "Parsed Input",
            "Output"
    };

    public static final Class[] CLASS_TYPES = {
            String.class,
            TreeNode.class,
            String.class
    };

    public static class HistoryEntry {
        public String input;
        public TreeNode parsedInput;
        public String output;

        public HistoryEntry(String input, TreeNode parsedInput, String output){
            this.input = input;
            this.parsedInput = parsedInput;
            this.output = output;
        }

        Object nthValue(int n){
            if(n == 0) return input;
            if(n == 1) return parsedInput;
            if(n == 2) return output;
            return null;
        }
    }

    ArrayList<HistoryEntry> entries;

    public HistoryTableModel() {
        entries = new ArrayList<>();
    }

    public void addEntry(HistoryEntry entry){
        entries.add(entry);
    }

        @Override
    public int getRowCount() {
        return entries.size();
    }

    @Override
    public int getColumnCount() {
        return 3;
    }

    @Override
    public String getColumnName(int columnIndex) {
        return COLUMN_NAMES[columnIndex];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return CLASS_TYPES[columnIndex];
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return entries.get(rowIndex).nthValue(columnIndex);
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        return;
    }

    @Override
    public void addTableModelListener(TableModelListener l) {

    }

    @Override
    public void removeTableModelListener(TableModelListener l) {

    }
}

package org.nwapw.abacus.window;

import org.nwapw.abacus.tree.TreeNode;

import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import java.util.ArrayList;

/**
 * A table model to store data about the history of inputs
 * in the calculator.
 */
public class HistoryTableModel extends AbstractTableModel {

    /**
     * Static array used to get the column names.
     */
    public static final String[] COLUMN_NAMES = {
            "Input",
            "Parsed Input",
            "Output"
    };

    /**
     * Static array used to get the class of each column.
     */
    public static final Class[] CLASS_TYPES = {
            String.class,
            TreeNode.class,
            String.class
    };

    /**
     * Class used specifically to hold data about
     * the previous entries into the calculator.
     */
    public static class HistoryEntry {
        public String input;
        public TreeNode parsedInput;
        public String output;

        public HistoryEntry(String input, TreeNode parsedInput, String output){
            this.input = input;
            this.parsedInput = parsedInput;
            this.output = output;
        }

        Object nthValue(int n){
            if(n == 0) return input;
            if(n == 1) return parsedInput;
            if(n == 2) return output;
            return null;
        }
    }

    /**
     * The list of entries.
     */
    ArrayList<HistoryEntry> entries;

    /**
     * Creates a new empty history table model
     */
    public HistoryTableModel() {
        entries = new ArrayList<>();
    }

    /**
     * Adds an entry to the model.
     * @param entry the entry to add.
     */
    public void addEntry(HistoryEntry entry){
        entries.add(entry);
    }

    @Override
    public int getRowCount() {
        return entries.size();
    }

    @Override
    public int getColumnCount() {
        return 3;
    }

    @Override
    public String getColumnName(int columnIndex) {
        return COLUMN_NAMES[columnIndex];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return CLASS_TYPES[columnIndex];
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return entries.get(rowIndex).nthValue(columnIndex);
    }

}

Comment and clean up HistoryTableModel code.