package context.apps.demos.homeactivity;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SpringLayout;
import javax.swing.layout.SpringUtilities;
public class SensorBarsPanel extends JPanel {
private static final long serialVersionUID = 6199944913790962578L;
private int sequenceLength;
private JLabel[] stateLabels;
private BarLabel[] evidenceBars;
public SensorBarsPanel(String sensorName) {
this.sequenceLength = HomeModel.SEQUENCE_LENGTH;
this.setOpaque(false);
this.setBorder(BorderFactory.createLineBorder(Color.gray));
this.setLayout(new BorderLayout());
this.setBackground(new Color(255, 200, 100, 100));
JLabel nameLabel = new JLabel(sensorName);
this.add(nameLabel, BorderLayout.NORTH);
JPanel barsPanel = new JPanel();
barsPanel.setOpaque(false);
barsPanel.setLayout(new SpringLayout());
this.add(barsPanel, BorderLayout.CENTER);
stateLabels = new JLabel[sequenceLength];
evidenceBars = new BarLabel[sequenceLength];
for (int t = sequenceLength - 1; t >= 0; t--) {
String timeStr;
if (t == sequenceLength - 1) {
timeStr = "Now";
} else {
timeStr = (t + 1 - sequenceLength) + " min";
}
JLabel timeLabel = new JLabel("<html><b>" + timeStr + ":</b></html>");
barsPanel.add(timeLabel);
stateLabels[t] = new JLabel("On/Off");
stateLabels[t].setFont(stateLabels[t].getFont().deriveFont(Font.PLAIN));
barsPanel.add(stateLabels[t]);
evidenceBars[t] = new BarLabel();
barsPanel.add(evidenceBars[t]);
}
SpringUtilities.makeCompactGrid(barsPanel,
sequenceLength, 3, // rows, cols
6, 6, // initX, initY
6, 6); // xPad, yPad
}
public void setEvidences(double[] evidences) {
for (int t = 0; t < sequenceLength; t++) {
evidenceBars[t].setEvidence(evidences[t]);
}
}
public void setStates(int[] states) {
for (int t = 0; t < sequenceLength; t++) {
if (states[t] == 1) {
stateLabels[t].setText("On");
stateLabels[t].setForeground(Color.green);
}
else {
stateLabels[t].setText("Off");
stateLabels[t].setForeground(Color.red);
}
}
}
public class BarLabel extends JLabel {
private static final long serialVersionUID = -3355017981073149492L;
private double evidence;
public BarLabel() {
setPreferredSize(new Dimension(100, 20));
setBorder(BorderFactory.createLineBorder(Color.gray));
}
public void setEvidence(double evidence) {
this.evidence = evidence;
}
public void paint(Graphics g) {
super.paint(g);
/*
* Calculate and calibrate length of bar
*/
int length = (int) (Math.log(Math.abs(evidence) / 1e3) * 2);
// System.out.println("evidence = " + evidence + ", length = " + length);
int w_2 = getWidth() / 2;
int h = getHeight();
if (evidence >= 0) {
g.setColor(FloorplanPanel.SENSOR_BLUE);
g.fillRect(w_2, 0, length, h - 1);
g.setColor(Color.black);
g.drawRect(w_2, 0, length, h - 1);
} else {
g.setColor(FloorplanPanel.SENSOR_RED);
g.fillRect(w_2 - length, 0, length, h - 1);
g.setColor(Color.black);
g.drawRect(w_2 - length, 0, length, h - 1);
}
}
}
}