package eclipse.view.gui;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.text.SimpleDateFormat;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.DefaultTableModel;
import eclipse.controller.util.TelemetrySettings;
import eclipse.model.data.DataManager;
import eclipse.model.data.Device;
import eclipse.model.data.DeviceItem;
import eclipse.view.gui.tab.TabPane;
import eclipse.view.gui.tab.TelemetryGraph;
import eclipse.view.gui.tab.tabDetails;
/**
* This class is used to create the table that displays the car data
*
*Similar to Important table
*
* @author MArco
*
*/
public class DeviceTable extends JPanel implements ItemListener
{
private static final long serialVersionUID = -2652127495341433024L;
private static final int deviceCount = 13;
private JScrollPane scrollPane;
private JTable dataTable;
private JButton btnGraph;
private JButton btnIndex;
private JButton btn_Monitor;
private JButton btnAll;
private JButton btnNone;
private DataManager dataManager = DataManager.getInstance();
JPanel[] checkBoxPanel = new JPanel[3];
JCheckBox[] deviceCheckBox = new JCheckBox[deviceCount];
Device dev;
/**
* Creates the panel
*/
public DeviceTable() {
// Builds a layout without borders between elements
this.setLayout(new BorderLayout());
DefaultTableModel model = new DefaultTableModel(0, 5)
{
private static final long serialVersionUID = 5555926687022393905L;
public boolean isCellEditable(int row, int column)
{
return false;//This causes all cells to be not editable
}
};
dataTable = new JTable(model);
btnGraph = new JButton("Graph");
btnIndex = new JButton("Keep");
btn_Monitor = new JButton("Monitor");
btnAll = new JButton("All");
btnNone = new JButton("None");
JPanel upControlPanel = new JPanel();
upControlPanel.setLayout(new BoxLayout(upControlPanel, BoxLayout.Y_AXIS));
checkBoxPanel[0] = new JPanel();
checkBoxPanel[1] = new JPanel();
checkBoxPanel[2] = new JPanel();
deviceCheckBox[0] = new JCheckBox("Driver");
deviceCheckBox[1] = new JCheckBox("Drive (L)");
deviceCheckBox[2] = new JCheckBox("Drive (R)");
deviceCheckBox[3] = new JCheckBox("BMS");
deviceCheckBox[4] = new JCheckBox("Dash");
deviceCheckBox[5] = new JCheckBox("Instru");
deviceCheckBox[6] = new JCheckBox("Volant");
deviceCheckBox[7] = new JCheckBox("MPPT (M)");
deviceCheckBox[8] = new JCheckBox("MPPT (S)");
deviceCheckBox[9] = new JCheckBox("PSU");
deviceCheckBox[10] = new JCheckBox("Ignition");
deviceCheckBox[11] = new JCheckBox("Flashers");
deviceCheckBox[12] = new JCheckBox("Muppet");
int i;
for (i = 0; i<deviceCount ; i++) {
deviceCheckBox[i].setSelected(true);
deviceCheckBox[i].addItemListener(this);
}
for (i = 0 ; i<4 ; i++) {
checkBoxPanel[0].add(deviceCheckBox[i]);
}
for (; i<9 ; i++) {
checkBoxPanel[1].add(deviceCheckBox[i]);
}
for (; i<deviceCount ; i++) {
checkBoxPanel[2].add(deviceCheckBox[i]);
}
JPanel buttonPanel = new JPanel();
buttonPanel.add(btnAll);
buttonPanel.add(btnGraph);
buttonPanel.add(btnIndex);
buttonPanel.add(btnNone);
buttonPanel.add(btn_Monitor);
//Action Listner on the button, to use in case we want to add items to important list
btnIndex.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e) {
for (int i : dataTable.getSelectedRows())
{
String deviceId = (String) dataTable.getModel().getValueAt(i, 0);
deviceId=deviceId.substring(0,deviceId.indexOf("-"));
String deviceItemId = (String) dataTable.getModel().getValueAt(i, 1);
deviceItemId=deviceItemId.substring(0,deviceItemId.indexOf("-"));
Device dev = dataManager.getDeviceByID(Integer.valueOf(deviceId));
DeviceItem item = dev.getItemByID(Integer.valueOf(deviceItemId));
DesktopManager.getIstance().getImportantPanel().addItem(item, dev);
String importantValuesRaw = TelemetrySettings.getInstance().getSetting("GUI_IMPORTANT_VALUES");
if (importantValuesRaw.contains("."))
{
importantValuesRaw = importantValuesRaw + ",";
}
importantValuesRaw = importantValuesRaw + deviceId + "." + deviceItemId;
TelemetrySettings.getInstance().setSetting("GUI_IMPORTANT_VALUES", importantValuesRaw);
}
}
});
btnGraph.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
for (int i : dataTable.getSelectedRows())
{
String deviceId = (String) dataTable.getModel().getValueAt(i, 0);
deviceId=deviceId.substring(0,deviceId.indexOf("-"));
String deviceItemId = (String) dataTable.getModel().getValueAt(i, 1);
deviceItemId=deviceItemId.substring(0,deviceItemId.indexOf("-"));
Device dev = dataManager.getDeviceByID(Integer.valueOf(deviceId));
DeviceItem item = dev.getItemByID(Integer.valueOf(deviceItemId));
DesktopManager.getIstance().getTabbedPannel().addTab(
new TelemetryGraph(Integer.valueOf(deviceId), Integer.valueOf(deviceItemId)),dev.getDeviceName()+"-"+item.getName());
}
}
});
btn_Monitor.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
for (int i : dataTable.getSelectedRows())
{
String deviceId = (String) dataTable.getModel().getValueAt(i, 0);
deviceId=deviceId.substring(0,deviceId.indexOf("-"));
String deviceItemId = (String) dataTable.getModel().getValueAt(i, 1);
deviceItemId=deviceItemId.substring(0,deviceItemId.indexOf("-"));
((tabDetails)((JTabbedPane)DesktopManager.getIstance().getTabbedPannel().getComponent(0)).getComponent(1)).addItem(deviceId, deviceItemId);
}
}
});
btnAll.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
int i;
for (i=0; i<deviceCount ; i++)
{
deviceCheckBox[i].setSelected(true);
}
}
});
btnNone.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int i;
for (i=0; i<deviceCount ; i++) {
deviceCheckBox[i].setSelected(false);
}
}
});
// Set default width for the table columns
dataTable.setFillsViewportHeight(true);
dataTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
dataTable.getColumnModel().getColumn(0).setPreferredWidth(50); // Device
dataTable.getColumnModel().getColumn(1).setPreferredWidth(60); // Item
dataTable.getColumnModel().getColumn(2).setPreferredWidth(10); // Value
dataTable.getColumnModel().getColumn(3).setPreferredWidth(2); // Last seen
dataTable.getColumnModel().getColumn(4).setPreferredWidth(60); // Unit
dataTable.getColumnModel().getColumn(0).setHeaderValue(TelemetrySettings.getInstance().getSetting("GUI_TABLE_COLUMN_DEVICE"));
dataTable.getColumnModel().getColumn(1).setHeaderValue(TelemetrySettings.getInstance().getSetting("GUI_TABLE_COLUMN_DEVICE_ITEM"));
dataTable.getColumnModel().getColumn(2).setHeaderValue(TelemetrySettings.getInstance().getSetting("GUI_TABLE_COLUMN_VALUE"));
dataTable.getColumnModel().getColumn(3).setHeaderValue(TelemetrySettings.getInstance().getSetting("GUI_TABLE_COLUMN_UNIT"));
dataTable.getColumnModel().getColumn(4).setHeaderValue(TelemetrySettings.getInstance().getSetting("GUI_TABLE_COLUMN_LAST_SEEN"));
// Creates a scroll pane as a container for the table
scrollPane = new JScrollPane(dataTable);
this.add(scrollPane);
upControlPanel.add(buttonPanel);
upControlPanel.add(checkBoxPanel[0]);
upControlPanel.add(checkBoxPanel[1]);
upControlPanel.add(checkBoxPanel[2]);
this.add(upControlPanel, BorderLayout.NORTH);
fillTable();
}
public void itemStateChanged(ItemEvent ev) {
emptyTable();
fillTable();
updateTable();
}
/**
* This method is called every second by the DesktopManager to add one line to the table
*/
public void updateTable() {
int i=0;
int j=0;
for(Device dev : DataManager.getInstance().getDevices()) {
if (deviceCheckBox[j].isSelected()) {
for(DeviceItem item : dev.getItems()){
String S = new SimpleDateFormat("hh:mm:ss:SS").format(item.getLastSeen());
dataTable.getModel().setValueAt(item.getLastData(), i, 2);
dataTable.getModel().setValueAt(S, i, 4);
i++;
}
}
j++;
}
}
public void fillTable() {
//Fill table
int i=0;
int j=0;
String lbl1;
String lbl2;
//Create static information (name, unit, etc)s
for(Device dev : DataManager.getInstance().getDevices()) {
if (deviceCheckBox[j].isSelected()) {
lbl1=dev.getDeviceId()+"-"+dev.getDeviceName();
for(DeviceItem item : dev.getItems()){
((DefaultTableModel)dataTable.getModel()).addRow(new Object[]{"", "", "", "", ""});
lbl2=item.getItemId()+"-"+item.getName();
dataTable.getModel().setValueAt(lbl1, i, 0);
dataTable.getModel().setValueAt(lbl2, i, 1);
dataTable.getModel().setValueAt(item.getUnit(), i, 3);
i++;
}
}
j++;
}
}
public void emptyTable() {
int rowCount = ((DefaultTableModel)dataTable.getModel()).getRowCount();
for(int i=0; i<rowCount; i++) {
((DefaultTableModel)dataTable.getModel()).removeRow(0);
}
}
}