package com.vgi.mafscaling; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.Desktop; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Stroke; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; import java.net.URI; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextPane; import javax.swing.ListSelectionModel; import javax.swing.SwingConstants; import javax.swing.border.LineBorder; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.DefaultTableModel; import javax.swing.table.JTableHeader; import javax.swing.table.TableCellEditor; import javax.swing.table.TableColumn; import javax.swing.text.JTextComponent; import org.apache.log4j.Logger; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.labels.StandardXYSeriesLabelGenerator; import org.jfree.chart.labels.StandardXYToolTipGenerator; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYDotRenderer; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.chart.title.LegendTitle; import org.jfree.data.function.Function2D; import org.jfree.data.function.LineFunction2D; import org.jfree.data.statistics.Regression; import org.jfree.data.xy.XYDataset; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; import org.jfree.ui.RectangleEdge; import org.jfree.util.ShapeUtilities; import org.math.plot.Plot3DPanel; public abstract class ACompCalc extends FCTabbedPane implements ActionListener, IMafChartHolder { private static final long serialVersionUID = 5944026307547635365L; private static final Logger logger = Logger.getLogger(ACompCalc.class); protected static final String dvdtAxisName = "dV / dt"; protected static final String trendDataName = "Trend"; protected static final int ColumnWidth = 70; protected static final int TableWidth = 250; protected static final int TableRowCount = 20; protected static final int LogDataRowCount = 200; protected JScrollPane dataScrollPane = null; protected JTable origTable = null; protected JTable newTable = null; protected JTable corrTable = null; protected JTable corrCountTable = null; protected JTable logDataTable = null; protected JPanel plotPanel = null; protected JCheckBox compareTableCheckBox = null; protected ButtonGroup rbGroup = null; protected ChartPanel chartPanel = null; protected Plot3DPanel plot3d = null; protected ArrayList<ExcelAdapter> excelAdapterList = new ArrayList<ExcelAdapter>(); protected ArrayList<Double> xAxisArray = null; protected ArrayList<Double> yAxisArray = null; protected ArrayList<ArrayList<Double>> savedNewTable = new ArrayList<ArrayList<Double>>(); protected List<XYSeries> corrData = new ArrayList<XYSeries>(); protected XYSeries runData = new XYSeries(dvdtAxisName); protected XYSeries trendData = new XYSeries(trendDataName); protected String origTableName; protected String newTableName; protected String corrTableName; protected String corrCountTableName; protected String x3dAxisName; protected String y3dAxisName; protected String z3dAxisName; protected Insets insets0 = new Insets(0, 0, 0, 0); protected Insets insets1 = new Insets(1, 1, 1, 1); protected Insets insets2 = new Insets(2, 2, 2, 2); protected Insets insets3 = new Insets(3, 3, 3, 3); protected String[] optionButtons = { "Yes", "No", "No to all" }; public ACompCalc(int tabPlacement) { super(tabPlacement); } protected abstract void createControlPanel(JPanel dataPanel); protected abstract void createGraphTab(); protected abstract void loadLogFile(); protected abstract boolean processLog(); protected abstract boolean displayData(); protected abstract void formatTable(JTable table); protected abstract String usage(); protected void selectLogFile() { fileChooser.setMultiSelectionEnabled(true); if (JFileChooser.APPROVE_OPTION != fileChooser.showOpenDialog(this)) return; loadLogFile(); } protected void onDroppedFiles(List<File> files) { if (files.size() > 0 && getSelectedIndex() == 0) { fileChooser.setMultiSelectionEnabled(true); fileChooser.setCurrentDirectory(files.get(0)); fileChooser.setSelectedFiles((File[])files.toArray()); fileChooser.approveSelection(); loadLogFile(); } } protected void initialize(String[] logColumns) { createDataTab(logColumns); createGraphTab(); create3dGraphTab(); createUsageTab(); } protected void createDataTab(String[] logColumns) { JPanel dataPanel = new JPanel(); add(dataPanel, "<html><div style='text-align: center;'>D<br>a<br>t<br>a</div></html>"); GridBagLayout gbl_dataPanel = new GridBagLayout(); gbl_dataPanel.columnWidths = new int[] {0, 0}; gbl_dataPanel.rowHeights = new int[] {0, 0}; gbl_dataPanel.columnWeights = new double[]{0.0, 0.0}; gbl_dataPanel.rowWeights = new double[]{0.0, 1.0}; dataPanel.setLayout(gbl_dataPanel); createControlPanel(dataPanel); createDataPanel(dataPanel, logColumns); } protected void createDataPanel(JPanel dataPanel, String[] logColumns) { dataScrollPane = new JScrollPane(); GridBagConstraints gbc_dataScrollPane = new GridBagConstraints(); gbc_dataScrollPane.weightx = 0; gbc_dataScrollPane.weighty = 1.0; gbc_dataScrollPane.fill = GridBagConstraints.BOTH; gbc_dataScrollPane.ipadx = ColumnWidth * logColumns.length; gbc_dataScrollPane.gridx = 0; gbc_dataScrollPane.gridy = 1; dataPanel.add(dataScrollPane, gbc_dataScrollPane); JPanel dataRunPanel = new JPanel(); dataScrollPane.setViewportView(dataRunPanel); GridBagLayout gbl_dataRunPanel = new GridBagLayout(); gbl_dataRunPanel.columnWidths = new int[]{0}; gbl_dataRunPanel.rowHeights = new int[] {0}; gbl_dataRunPanel.columnWeights = new double[]{0.0}; gbl_dataRunPanel.rowWeights = new double[]{0.0}; dataRunPanel.setLayout(gbl_dataRunPanel); JScrollPane dataTablesScrollPane = new JScrollPane(); GridBagConstraints gbc_dataTablesScrollPane = new GridBagConstraints(); gbc_dataTablesScrollPane.weightx = 1.0; gbc_dataTablesScrollPane.weighty = 1.0; gbc_dataTablesScrollPane.anchor = GridBagConstraints.PAGE_START; gbc_dataTablesScrollPane.fill = GridBagConstraints.BOTH; gbc_dataTablesScrollPane.gridx = 1; gbc_dataTablesScrollPane.gridy = 1; dataPanel.add(dataTablesScrollPane, gbc_dataTablesScrollPane); JPanel tablesPanel = new JPanel(); dataTablesScrollPane.setViewportView(tablesPanel); GridBagLayout gbl_tablesPanel = new GridBagLayout(); gbl_tablesPanel.columnWidths = new int[]{0, 0}; gbl_tablesPanel.rowHeights = new int[] {0, 0, 0, 0, 0, 0, 0, 0}; gbl_tablesPanel.columnWeights = new double[]{0.0, 1.0}; gbl_tablesPanel.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}; tablesPanel.setLayout(gbl_tablesPanel); createLogDataTable(dataRunPanel, logColumns); createDataTables(tablesPanel); } protected void createLogDataTable(JPanel panel, String[] columns) { logDataTable = new JTable(); logDataTable.getTableHeader().setReorderingAllowed(false); logDataTable.setModel(new DefaultTableModel(LogDataRowCount, columns.length)); logDataTable.setColumnSelectionAllowed(true); logDataTable.setCellSelectionEnabled(true); logDataTable.setBorder(new LineBorder(new Color(0, 0, 0))); logDataTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); logDataTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); logDataTable.putClientProperty("terminateEditOnFocusLost", true); for (int i = 0; i < columns.length; ++i) logDataTable.getColumnModel().getColumn(i).setHeaderValue(columns[i]); Utils.initializeTable(logDataTable, ColumnWidth); GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = insets0; gbc.gridx = 0; gbc.gridy = 0; JTableHeader header = logDataTable.getTableHeader(); panel.add(header, gbc); gbc.gridy = 1; panel.add(logDataTable, gbc); ExcelAdapter excelAdapter = new ExcelAdapter(); excelAdapter.addTable(logDataTable, true, false); excelAdapterList.add(excelAdapter); } protected void create3dGraphTab() { plotPanel = new JPanel(); add(plotPanel, "<html><div style='text-align: center;'>3<br>D<br><br>C<br>h<br>a<br>r<br>t</div></html>"); GridBagLayout gbl_plotPanel = new GridBagLayout(); gbl_plotPanel.columnWidths = new int[] {0}; gbl_plotPanel.rowHeights = new int[] {0}; gbl_plotPanel.columnWeights = new double[]{1.0}; gbl_plotPanel.rowWeights = new double[]{1.0}; plotPanel.setLayout(gbl_plotPanel); plot3d = new Plot3DPanel("SOUTH") { private static final long serialVersionUID = 7914951068593204419L; public void addPlotToolBar(String location) { super.addPlotToolBar(location); super.plotToolBar.remove(7); super.plotToolBar.remove(5); super.plotToolBar.remove(4); } }; plot3d.setAutoBounds(); plot3d.setAutoscrolls(true); plot3d.setEditable(false); plot3d.setBorder(BorderFactory.createLineBorder(Color.BLACK)); plot3d.setForeground(Color.BLACK); plot3d.getAxis(0).setColor(Color.BLACK); plot3d.getAxis(1).setColor(Color.BLACK); plot3d.getAxis(2).setColor(Color.BLACK); plot3d.setAxisLabel(0, x3dAxisName); plot3d.setAxisLabel(1, y3dAxisName); plot3d.setAxisLabel(2, z3dAxisName); GridBagConstraints gbl_chartPanel = new GridBagConstraints(); gbl_chartPanel.anchor = GridBagConstraints.CENTER; gbl_chartPanel.insets = insets3; gbl_chartPanel.fill = GridBagConstraints.BOTH; gbl_chartPanel.gridx = 0; gbl_chartPanel.gridy = 0; plotPanel.add(plot3d, gbl_chartPanel); } protected void createDataTables(JPanel panel) { origTable = createDataTable(panel, origTableName, 0, true); newTable = createDataTable(panel, newTableName, 2, false); corrTable = createDataTable(panel, corrTableName, 4, false); corrCountTable = createDataTable(panel, corrCountTableName, 6, false); } protected JTable createDataTable(JPanel panel, String tableName, int gridy, boolean isOriginalTable) { return createDataTable(panel, tableName, TableRowCount, TableRowCount, 0, gridy, isOriginalTable, true, true); } protected JTable createDataTable(JPanel panel, String tableName, int colCount, int gridx, boolean isOriginalTable) { return createDataTable(panel, tableName, colCount, TableRowCount, gridx, 0, isOriginalTable, true, false); } private JTable createDataTable(JPanel panel, String tableName, int colCount, int rowCount, int gridx, int gridy, boolean isOriginalTable, boolean extendRows, boolean extendCols) { final JTable table; ExcelAdapter excelAdapter; if (isOriginalTable) { table = new JTable() { private static final long serialVersionUID = 3218402382894083287L; public boolean isCellEditable(int row, int column) { return false; }; }; excelAdapter = new ExcelAdapter() { protected void onPaste(JTable table, boolean extendRows, boolean extendCols) { if (table.getSelectedRows() == null || table.getSelectedRows().length == 0 || table.getSelectedColumns() == null || table.getSelectedColumns().length == 0) return; if (table.getSelectedRows()[0] != 0 || table.getSelectedColumns()[0] != 0) { JOptionPane.showMessageDialog(null, "Please paste copied table into the first cell", "Error", JOptionPane.ERROR_MESSAGE); return; } super.onPaste(table, extendRows, extendCols); validateTable(table); clearRunTables(); } }; excelAdapter.addTable(table, false, true, false, false, true, true, false, extendRows, extendCols); excelAdapterList.add(excelAdapter); } else { table = new JTable() { private static final long serialVersionUID = -3754572906310312568L; public boolean isCellEditable(int row, int column) { return isNonOriginalTableCellEditable(row, column); }; public Component prepareEditor(TableCellEditor editor, int row, int column) { Component c = super.prepareEditor(editor, row, column); if (c instanceof JTextComponent) ((JTextComponent) c).selectAll(); return c; } }; excelAdapter = new ExcelAdapter(); excelAdapter.addTable(table, false, true, false, false, true, true, false, false, false); excelAdapterList.add(excelAdapter); } DefaultTableColumnModel tableModel = new DefaultTableColumnModel(); final TableColumn tableColumn = new TableColumn(0, (colCount == 1 ? ColumnWidth : TableWidth)); tableColumn.setHeaderValue(tableName); tableModel.addColumn(tableColumn); JTableHeader lblTableHeaderName = table.getTableHeader(); lblTableHeaderName.setColumnModel(tableModel); lblTableHeaderName.setReorderingAllowed(false); DefaultTableCellRenderer headerRenderer = (DefaultTableCellRenderer) lblTableHeaderName.getDefaultRenderer(); headerRenderer.setHorizontalAlignment(SwingConstants.LEFT); GridBagConstraints gbc_lblTableName = new GridBagConstraints(); gbc_lblTableName.insets = new Insets((gridy == 0 ? 0 : 5),0,0,0); gbc_lblTableName.anchor = GridBagConstraints.NORTHWEST; gbc_lblTableName.fill = GridBagConstraints.HORIZONTAL; gbc_lblTableName.gridx = gridx; gbc_lblTableName.gridy = gridy; panel.add(lblTableHeaderName, gbc_lblTableName); table.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { tableColumn.setWidth(table.getWidth()); } }); table.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { JTable eventTable =(JTable)event.getSource(); int colIdx = eventTable.getSelectedColumn(); int rowIdx = eventTable.getSelectedRow(); JTable[] tables = new JTable[] {origTable, newTable, corrTable, corrCountTable}; for (JTable t : tables) { if (t == null || t == eventTable) continue; if (t.getColumnCount() - 1 >= colIdx && t.getRowCount() - 1 >= rowIdx) { t.setColumnSelectionInterval(colIdx, colIdx); t.setRowSelectionInterval(rowIdx, rowIdx); } } } public void mouseReleased(MouseEvent event) { JTable eventTable =(JTable)event.getSource(); int[] cols = eventTable.getSelectedColumns(); int[] rows = eventTable.getSelectedRows(); int lastColIdx = cols.length - 1; int lastRowIdx = rows.length - 1; JTable[] tables = new JTable[] {origTable, newTable, corrTable, corrCountTable}; for (JTable t : tables) { if (t == null || t == eventTable) continue; if (t.getColumnCount() - 1 >= cols[lastColIdx] && t.getRowCount() - 1 >= rows[lastRowIdx]) { t.setColumnSelectionInterval(cols[0], cols[lastColIdx]); t.setRowSelectionInterval(rows[0], rows[lastRowIdx]); } } } }); table.setName(tableName); table.getTableHeader().setReorderingAllowed(false); table.setColumnSelectionAllowed(true); table.setCellSelectionEnabled(true); table.setBorder(new LineBorder(new Color(0, 0, 0))); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); table.setModel(new DefaultTableModel(rowCount, colCount)); table.putClientProperty("terminateEditOnFocusLost", true); Utils.initializeTable(table, ColumnWidth); formatTable(table); GridBagConstraints gbc_table = new GridBagConstraints(); gbc_table.insets = insets0; gbc_table.anchor = GridBagConstraints.NORTHWEST; gbc_table.gridx = gridx; gbc_table.gridy = gridy + 1; panel.add(table, gbc_table); return table; } protected boolean isNonOriginalTableCellEditable(int row, int column) { return true; } protected void createChart(JPanel plotPanel, String xAxisName, String yAxisName) { JFreeChart chart = ChartFactory.createScatterPlot(null, null, null, null, PlotOrientation.VERTICAL, false, true, false); chart.setBorderVisible(true); chartPanel = new ChartPanel(chart, true, true, true, true, true); chartPanel.setAutoscrolls(true); chartPanel.setMouseZoomable(false); GridBagConstraints gbl_chartPanel = new GridBagConstraints(); gbl_chartPanel.anchor = GridBagConstraints.CENTER; gbl_chartPanel.insets = new Insets(3, 3, 3, 3); gbl_chartPanel.weightx = 1.0; gbl_chartPanel.weighty = 1.0; gbl_chartPanel.fill = GridBagConstraints.BOTH; gbl_chartPanel.gridx = 0; gbl_chartPanel.gridy = 1; plotPanel.add(chartPanel, gbl_chartPanel); XYDotRenderer dotRenderer = new XYDotRenderer(); dotRenderer.setSeriesPaint(0, new Color(0, 51, 102)); dotRenderer.setDotHeight(3); dotRenderer.setDotWidth(3); XYLineAndShapeRenderer lineRenderer = new XYLineAndShapeRenderer(); lineRenderer.setUseFillPaint(true); lineRenderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator( StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT, new DecimalFormat("0.00"), new DecimalFormat("0.00"))); Stroke stroke = new BasicStroke(2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 1.0f, null, 0.0f); lineRenderer.setSeriesStroke(0, stroke); lineRenderer.setSeriesPaint(0, Color.RED); lineRenderer.setSeriesShape(0, ShapeUtilities.createDiamond((float) 2.5)); lineRenderer.setLegendItemLabelGenerator( new StandardXYSeriesLabelGenerator() { private static final long serialVersionUID = 7593430826693873496L; public String generateLabel(XYDataset dataset, int series) { XYSeries xys = ((XYSeriesCollection)dataset).getSeries(series); return xys.getDescription(); } } ); NumberAxis xAxis = new NumberAxis(xAxisName); xAxis.setAutoRangeIncludesZero(false); NumberAxis yAxis = new NumberAxis(yAxisName); yAxis.setAutoRangeIncludesZero(false); XYSeriesCollection scatterDataset = new XYSeriesCollection(runData); XYSeriesCollection lineDataset = new XYSeriesCollection(); trendData.setDescription(trendDataName); lineDataset.addSeries(trendData); XYPlot plot = chart.getXYPlot(); plot.setRangePannable(true); plot.setDomainPannable(true); plot.setDomainGridlinePaint(Color.DARK_GRAY); plot.setRangeGridlinePaint(Color.DARK_GRAY); plot.setBackgroundPaint(new Color(224, 224, 224)); plot.setDataset(0, lineDataset); plot.setRenderer(0, lineRenderer); plot.setDomainAxis(0, xAxis); plot.setRangeAxis(0, yAxis); plot.mapDatasetToDomainAxis(0, 0); plot.mapDatasetToRangeAxis(0, 0); plot.setDataset(1, scatterDataset); plot.setRenderer(1, dotRenderer); plot.mapDatasetToDomainAxis(1, 0); plot.mapDatasetToRangeAxis(1, 0); LegendTitle legend = new LegendTitle(plot.getRenderer()); legend.setItemFont(new Font("Arial", 0, 10)); legend.setPosition(RectangleEdge.TOP); chart.addLegend(legend); } protected void createUsageTab() { final Desktop desktop = Desktop.getDesktop(); JTextPane usageTextArea = new JTextPane(); usageTextArea.setMargin(new Insets(10, 10, 10, 10)); usageTextArea.setContentType("text/html"); usageTextArea.setText(usage()); usageTextArea.setEditable(false); usageTextArea.setCaretPosition(0); usageTextArea.addHyperlinkListener(new HyperlinkListener() { @Override public void hyperlinkUpdate(HyperlinkEvent e) { if (HyperlinkEvent.EventType.ACTIVATED == e.getEventType()) { try { desktop.browse(new URI(e.getURL().toString())); } catch (Exception e1) { e1.printStackTrace(); } } } }); JScrollPane textScrollPane = new JScrollPane(usageTextArea); textScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); textScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); add(textScrollPane, "<html><div style='text-align: center;'>U<br>s<br>a<br>g<br>e</div></html>"); } protected JButton addButton(JPanel panel, int column, String name, String action, int align) { JButton button = new JButton(name); button.setActionCommand(action); button.addActionListener(this); GridBagConstraints gbc_button = new GridBagConstraints(); gbc_button.anchor = align; gbc_button.insets = insets2; gbc_button.gridx = column; gbc_button.gridy = 0; if (GridBagConstraints.CENTER == align) gbc_button.weightx = 1.0; panel.add(button, gbc_button); return button; } protected void addLabel(JPanel panel, int column, String text) { JLabel label = new JLabel(text); GridBagConstraints gbc_label = new GridBagConstraints(); gbc_label.anchor = GridBagConstraints.EAST; gbc_label.insets = new Insets(2, 4, 2, 0); gbc_label.gridx = column; gbc_label.gridy = 0; panel.add(label, gbc_label); } protected JComboBox<String> addComboBox(JPanel panel, int column, String[] values) { JComboBox<String> combo = new JComboBox<String>(values); combo.setSelectedIndex(0); GridBagConstraints gbc_combo = new GridBagConstraints(); gbc_combo.anchor = GridBagConstraints.WEST; gbc_combo.insets = insets2; gbc_combo.gridx = column; gbc_combo.gridy = 0; panel.add(combo, gbc_combo); return combo; } protected JCheckBox addCheckBox(JPanel panel, int column, String name, String action) { JCheckBox check = new JCheckBox(name); if (action != null) { check.setActionCommand(action); check.addActionListener(this); } GridBagConstraints gbc_check = new GridBagConstraints(); gbc_check.insets = new Insets(2, 2, 2, 0); gbc_check.gridx = column; gbc_check.gridy = 0; panel.add(check, gbc_check); return check; } protected void addRadioButton(JPanel panel, int column, String name, String action) { JRadioButton button = new JRadioButton(name); button.setActionCommand(action); button.addActionListener(this); rbGroup.add(button); GridBagConstraints gbc_button = new GridBagConstraints(); gbc_button.anchor = GridBagConstraints.WEST; gbc_button.insets = new Insets(0, 0, 3, 3); gbc_button.gridx = column; gbc_button.gridy = 0; panel.add(button, gbc_button); } protected boolean getAxisData() { try { if (Utils.isTableEmpty(origTable)) { JOptionPane.showMessageDialog(null, "Please paste " + origTable.getName() + " table into top grid", "Error getting Engine Load Compensation table headers", JOptionPane.ERROR_MESSAGE); return false; } xAxisArray = new ArrayList<Double>(); yAxisArray = new ArrayList<Double>(); for (int i = 1; i < origTable.getColumnCount(); ++i) xAxisArray.add(Double.valueOf(origTable.getValueAt(0, i).toString())); for (int i = 1; i < origTable.getRowCount(); ++i) yAxisArray.add(Double.valueOf(origTable.getValueAt(i, 0).toString())); if (xAxisArray.size() > 0 && yAxisArray.size() > 0) return true; } catch (Exception e) { logger.error(e); JOptionPane.showMessageDialog(null, "Invalid value in " + origTable.getName() + " table: " + e, "Error getting Engine Load Compensation table headers", JOptionPane.ERROR_MESSAGE); } return false; } protected void clearTables() { clearRunTable(origTable); clearRunTables(); } protected void clearLogDataTables() { setCursor(new Cursor(Cursor.WAIT_CURSOR)); try { while (LogDataRowCount < logDataTable.getRowCount()) Utils.removeRow(LogDataRowCount, logDataTable); Utils.clearTable(logDataTable); clear2dChartData(); plot3d.removeAllPlots(); } finally { setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); } } protected int getLogTableEmptyRow() { if (logDataTable.getValueAt(0, 0) != null && logDataTable.getValueAt(0, 0).toString().isEmpty()) return 0; if (logDataTable.getValueAt(logDataTable.getRowCount() - 1, 0) != null && !logDataTable.getValueAt(0, 0).toString().isEmpty()) return logDataTable.getRowCount(); for (int i = logDataTable.getRowCount() - 2; i > 0; --i) { if (logDataTable.getValueAt(i, 0) != null && !logDataTable.getValueAt(i, 0).toString().isEmpty()) return i + 1; } return 0; } protected boolean validateTable(JTable table) { return Utils.validateTable(table); } protected void calculate() { setCursor(new Cursor(Cursor.WAIT_CURSOR)); try { clearRunTables(); if (getAxisData() && processLog()) displayData(); } catch (Exception e) { e.printStackTrace(); logger.error(e); JOptionPane.showMessageDialog(null, "Error: " + e, "Error", JOptionPane.ERROR_MESSAGE); } finally { setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); } } protected boolean plotTime2dChartData(String xAxisName, ArrayList<Double> xarr, String yAxisName, ArrayList<Double> yarr) { clear2dChartData(); if (setXYSeries(runData, xarr, yarr)) { double paddingX = runData.getMaxX() * 0.05; double paddingY = runData.getMaxY() * 0.05; XYPlot plot = chartPanel.getChart().getXYPlot(); plot.getDomainAxis(0).setRange(runData.getMinX() - paddingX, runData.getMaxX() + paddingX); plot.getRangeAxis(0).setRange(runData.getMinY() - paddingY, runData.getMaxY() + paddingY); plot.getDomainAxis(0).setLabel(xAxisName); plot.getRangeAxis(0).setLabel(yAxisName); plot.getRenderer(0).setSeriesVisible(0, false); return true; } return false; } protected boolean plotRel2dChartData(String xAxisName, ArrayList<Double> xarr, String yAxisName, ArrayList<Double> yarr) { clear2dChartData(); if (setXYSeries(runData, xarr, yarr)) { double[] ols = Regression.getOLSRegression(chartPanel.getChart().getXYPlot().getDataset(1), 0); Function2D curve = new LineFunction2D(ols[0], ols[1]); trendData.clear(); trendData.add(runData.getMinX(), curve.getValue(runData.getMinX())); trendData.add(runData.getMaxX(), curve.getValue(runData.getMaxX())); double paddingX = runData.getMaxX() * 0.05; double paddingY = runData.getMaxY() * 0.05; XYPlot plot = chartPanel.getChart().getXYPlot(); plot.getDomainAxis(0).setRange(runData.getMinX() - paddingX, runData.getMaxX() + paddingX); plot.getRangeAxis(0).setRange(runData.getMinY() - paddingY, runData.getMaxY() + paddingY); plot.getDomainAxis(0).setLabel(xAxisName); plot.getRangeAxis(0).setLabel(yAxisName); plot.getRenderer(0).setSeriesVisible(0, true); return true; } return false; } protected boolean plotCorrectionData(String xAxisName, String yAxisName) { XYSeries series; runData.clear(); trendData.clear(); clear2dChartData(); XYPlot plot = chartPanel.getChart().getXYPlot(); XYSeriesCollection lineDataset = (XYSeriesCollection) plot.getDataset(0); DecimalFormat df = new DecimalFormat(".00"); String val; int i = 0; int j = 0; if (!Utils.isTableEmpty(corrTable)) { try { for (i = 1; i < corrTable.getColumnCount(); ++i) { val = corrTable.getValueAt(0, i).toString(); series = new XYSeries(df.format(Double.valueOf(val))); for (j = 1; j < corrTable.getRowCount(); ++j) { if (corrTable.getValueAt(j, i) != null) { val = corrTable.getValueAt(j, i).toString(); if (!val.isEmpty()) series.add(Double.valueOf(corrTable.getValueAt(j, 0).toString()), Double.valueOf(val)); } } if (series.getItemCount() > 0) { corrData.add(series); series.setDescription(series.getKey().toString()); lineDataset.addSeries(series); } } plot.getDomainAxis(0).setAutoRange(true); plot.getRangeAxis(0).setAutoRange(true); plot.getDomainAxis(0).setLabel(xAxisName); plot.getRangeAxis(0).setLabel(yAxisName); plot.getRenderer(0).setSeriesVisible(0, false); } catch (NumberFormatException e) { logger.error(e); JOptionPane.showMessageDialog(null, "Error parsing number from " + corrTable.getName() + " table, cell(" + i + " : " + j + "): " + e, "Error", JOptionPane.ERROR_MESSAGE); return false; } } return true; } protected void plot3dCorrection() { plot3d.removeAllPlots(); if (!Utils.isTableEmpty(corrTable)) { try { double[] x = new double[xAxisArray.size()]; int i = 0; for (i = 0; i < xAxisArray.size(); ++i) x[i] = xAxisArray.get(i); double[] y = new double[yAxisArray.size()]; for (i = 0; i < yAxisArray.size(); ++i) y[i] = yAxisArray.get(i); double[][] z = Utils.doubleZArray(corrTable, x, y); Color[][] tableColors = Utils.generateTableColorMatrix(corrTable, 1, 1, y.length + 1, x.length + 1); Color[][] colors = new Color[y.length][x.length]; for (int j = 1; j < tableColors.length; ++j) for (i = 1; i < tableColors[j].length; ++i) colors[j - 1][i - 1] = tableColors[j][i]; plot3d.addGridPlot("Average Error % Plot", colors, x, y, z); } catch (Exception e) { logger.error(e); JOptionPane.showMessageDialog(null, "Error: " + e, "Error", JOptionPane.ERROR_MESSAGE); } } } protected void clearRunTables() { clearRunTable(newTable); clearRunTable(corrTable); clearRunTable(corrCountTable); savedNewTable.clear(); compareTableCheckBox.setSelected(false); } protected void clearRunTable(JTable table) { if (table == origTable) table.setModel(new DefaultTableModel(TableRowCount, TableRowCount)); else table.setModel(new DefaultTableModel(origTable.getRowCount(), origTable.getColumnCount())); Utils.initializeTable(table, ColumnWidth); formatTable(table); } protected void clear2dChartData() { XYPlot plot = chartPanel.getChart().getXYPlot(); XYSeriesCollection lineDataset = (XYSeriesCollection) plot.getDataset(0); for (XYSeries series : corrData) lineDataset.removeSeries(series); corrData.clear(); } protected boolean setXYSeries(XYSeries series, ArrayList<Double> xarr, ArrayList<Double> yarr) { if (xarr.size() == 0 || xarr.size() != yarr.size()) return false; series.clear(); for (int i = 0; i < xarr.size(); ++i) series.add(xarr.get(i), yarr.get(i), false); series.fireSeriesChanged(); return true; } protected boolean setCompareTables() { if (origTable.getColumnCount() != newTable.getColumnCount() || origTable.getRowCount() != newTable.getRowCount()) return false; ArrayList<Double> row; double v1, v2; Utils.clearTableColors(newTable); savedNewTable.clear(); for (int i = 1; i < origTable.getRowCount(); ++i) { row = new ArrayList<Double>(); savedNewTable.add(row); for (int j = 1; j < origTable.getColumnCount(); ++j) { try { v1 = Double.valueOf(origTable.getValueAt(i, j).toString()); v2 = Double.valueOf(newTable.getValueAt(i, j).toString()); row.add(v2); v2 = v2 - v1; if (v2 == 0) newTable.setValueAt("", i, j); else newTable.setValueAt(v2, i, j); } catch (Exception e) { unsetCompareTables(); return false; } } } Utils.colorTable(newTable); return true; } protected void unsetCompareTables() { Utils.clearTableColors(newTable); ArrayList<Double> row; for (int i = 0; i < savedNewTable.size(); ++i) { row = savedNewTable.get(i); for (int j = 0; j < row.size(); ++j) newTable.setValueAt(row.get(j), i + 1, j + 1); } Utils.colorTable(newTable); savedNewTable.clear(); } protected boolean checkActionPerformed(ActionEvent e) { if ("clearorig".equals(e.getActionCommand())) { clearTables(); } else if ("clearlog".equals(e.getActionCommand())) { clearLogDataTables(); clearRunTables(); } else if ("clearall".equals(e.getActionCommand())) { clearLogDataTables(); clearTables(); } else if ("go".equals(e.getActionCommand())) { calculate(); } else if ("loadlog".equals(e.getActionCommand())) { selectLogFile(); } else if ("hidelogtable".equals(e.getActionCommand())) { JCheckBox checkBox = (JCheckBox)e.getSource(); if (checkBox.isSelected()) dataScrollPane.setVisible(false); else dataScrollPane.setVisible(true); fireStateChanged(); } else if ("comparetables".equals(e.getActionCommand())) { JCheckBox checkBox = (JCheckBox)e.getSource(); if (checkBox.isSelected()) { if (!setCompareTables()) checkBox.setSelected(false); } else unsetCompareTables(); fireStateChanged(); } else return false; return true; } public void onMovePoint(int itemIndex, double valueX, double valueY) { } }