Added categories for cleaner tab layout

* Added estimated packet loss and next hop change count to node info panel
This commit is contained in:
nifi 2010-09-15 16:15:10 +00:00
parent 58db04ee64
commit bba653f20c
10 changed files with 416 additions and 275 deletions

View file

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: NodeInfoPanel.java,v 1.4 2010/09/14 23:04:51 nifi Exp $
* $Id: NodeInfoPanel.java,v 1.5 2010/09/15 16:15:10 nifi Exp $
*
* -----------------------------------------------------------------
*
@ -34,13 +34,15 @@
*
* Authors : Joakim Eriksson, Niclas Finne
* Created : 6 sep 2010
* Updated : $Date: 2010/09/14 23:04:51 $
* $Revision: 1.4 $
* Updated : $Date: 2010/09/15 16:15:10 $
* $Revision: 1.5 $
*/
package se.sics.contiki.collect.gui;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import javax.swing.JLabel;
import javax.swing.JPanel;
@ -48,6 +50,7 @@ import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import se.sics.contiki.collect.CollectServer;
import se.sics.contiki.collect.Node;
@ -62,77 +65,36 @@ public class NodeInfoPanel extends JPanel implements Visualizer {
private static final long serialVersionUID = -1060893468047793431L;
private final CollectServer server;
private final String category;
private final JTable nodeTable;
private final AbstractTableModel nodeModel;
private final NodeModel nodeModel;
private Node[] nodes;
public NodeInfoPanel(CollectServer server) {
public NodeInfoPanel(CollectServer server, String category) {
super(new BorderLayout());
this.server = server;
this.category = category;
nodeModel = new AbstractTableModel() {
nodeModel = new NodeModel();
nodeTable = new JTable(nodeModel) {
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1692207305977527004L;
public Dimension getPreferredScrollableViewportSize() {
return getPreferredSize();
}
private final String[] COLUMN_NAMES = {
"Node",
"Packets Received",
"Duplicates Received",
"Average Inter-packet time",
"Shortest Inter-packet time",
"Longest Inter-packet time",
};
protected JTableHeader createDefaultTableHeader() {
return new JTableHeader(columnModel) {
private static final long serialVersionUID = 1L;
public Object getValueAt(int row, int col) {
Node node = nodes[row];
switch (col) {
case 0:
return node;
case 1:
return node.getSensorDataAggregator().getPacketCount();
case 2:
return node.getSensorDataAggregator().getDuplicateCount();
case 3:
return node.getSensorDataAggregator().getAveragePeriod();
case 4: {
long time = node.getSensorDataAggregator().getShortestPeriod();
return time < Long.MAX_VALUE ? time : 0;
}
case 5:
return node.getSensorDataAggregator().getLongestPeriod();
default:
return null;
}
public String getToolTipText(MouseEvent e) {
int index = columnModel.getColumnIndexAtX(e.getPoint().x);
int realIndex = index < 0 ? index : columnModel.getColumn(index).getModelIndex();
return realIndex < 0 ? null : nodeModel.getColumnToolTip(realIndex);
}
};
}
public Class<?> getColumnClass(int c) {
if (c == 0) {
return Node.class;
}
if (c < 3) {
return Integer.class;
}
if (c < 6) {
return Long.class;
}
return super.getColumnClass(c);
}
public String getColumnName(int col) {
return COLUMN_NAMES[col];
}
public int getColumnCount() {
return COLUMN_NAMES.length;
}
public int getRowCount() {
return nodes == null ? 0 : nodes.length;
}
};
nodeTable = new JTable(nodeModel);
nodeTable.setFillsViewportHeight(true);
nodeTable.setAutoCreateRowSorter(true);
@ -141,7 +103,7 @@ public class NodeInfoPanel extends JPanel implements Visualizer {
renderer.setHorizontalAlignment(JLabel.RIGHT);
nodeTable.setDefaultRenderer(Node.class, renderer);
// Add time renderer
// Add renderer for time
renderer = new DefaultTableCellRenderer() {
private static final long serialVersionUID = 1L;
@ -152,6 +114,22 @@ public class NodeInfoPanel extends JPanel implements Visualizer {
};
nodeTable.setDefaultRenderer(Long.class, renderer);
// Add renderer for double
renderer = new DefaultTableCellRenderer() {
private static final long serialVersionUID = 1L;
public void setValue(Object value) {
if (value == null) {
setText(null);
}
double v = (Double) value + 0.0005;
int dec = ((int)(v * 1000)) % 1000;
setText((long)v + "." + (dec > 99 ? "" : "0") + (dec > 9 ? "" : "0") + dec);
}
};
renderer.setHorizontalAlignment(JLabel.RIGHT);
nodeTable.setDefaultRenderer(Double.class, renderer);
add(new JScrollPane(nodeTable), BorderLayout.CENTER);
}
@ -160,6 +138,11 @@ public class NodeInfoPanel extends JPanel implements Visualizer {
return this;
}
@Override
public String getCategory() {
return category;
}
@Override
public String getTitle() {
return "Node Info";
@ -226,16 +209,92 @@ public class NodeInfoPanel extends JPanel implements Visualizer {
time /= 1000;
if (time > 24 * 60 * 60) {
long days = time / (24 * 60 * 60);
sb.append(days).append(" days, ");
sb.append(days).append(days > 1 ? " days, " : " day, ");
time -= days * 24 * 60 * 60;
}
if (time > 60 * 60) {
long hours = time / (60 * 60);
sb.append(hours).append(" hours, ");
sb.append(hours).append(hours > 1 ? " hours, " : " hour, ");
time -= hours * 60 * 60;
}
sb.append(time / 60).append(" min, ").append(time % 60).append(" sec");
return sb.toString();
}
private class NodeModel extends AbstractTableModel {
private static final long serialVersionUID = 1692207305977527004L;
private final String[] COLUMN_NAMES = {
"Node", "Node",
"Packets", "Packets Received",
"Duplicates", "Duplicate Packets Received",
"Estimated Lost", "Estimated Lost Packets",
"Average Hops", "Average Hops to Sink",
"Next Hop Changes", "Next Hop Change Count",
"Average Inter-packet time", "Average Inter-packet Time",
"Shortest Inter-packet Time", "Shortest Inter-packet Time",
"Longest Inter-packet Time", "Longest Inter-packet Time"
};
private final Class<?>[] COLUMN_TYPES = {
Node.class,
Integer.class,
Integer.class,
Integer.class,
Double.class,
Integer.class,
Long.class,
Long.class,
Long.class
};
public Object getValueAt(int row, int col) {
Node node = nodes[row];
switch (col) {
case 0:
return node;
case 1:
return node.getSensorDataAggregator().getPacketCount();
case 2:
return node.getSensorDataAggregator().getDuplicateCount();
case 3:
return node.getSensorDataAggregator().getEstimatedLostCount();
case 4:
return node.getSensorDataAggregator().getAverageValue(SensorData.HOPS);
case 5:
return node.getSensorDataAggregator().getNextHopChangeCount();
case 6:
return node.getSensorDataAggregator().getAveragePeriod();
case 7: {
long time = node.getSensorDataAggregator().getShortestPeriod();
return time < Long.MAX_VALUE ? time : 0;
}
case 8:
return node.getSensorDataAggregator().getLongestPeriod();
default:
return null;
}
}
public Class<?> getColumnClass(int c) {
return COLUMN_TYPES[c];
}
public String getColumnName(int col) {
return COLUMN_NAMES[col * 2];
}
public String getColumnToolTip(int col) {
return COLUMN_NAMES[col * 2 + 1];
}
public int getColumnCount() {
return COLUMN_NAMES.length / 2;
}
public int getRowCount() {
return nodes == null ? 0 : nodes.length;
}
}
}