/*
* -------------------------------------------------------------------------
* $Id: EPanel.java,v 1.3 2004/10/11 13:22:29 estewart Exp $
* -------------------------------------------------------------------------
* Copyright (c) 1999 Visual Numerics Inc. All Rights Reserved.
*
* This software is confidential information which is proprietary to
* and a trade secret of Visual Numerics, Inc. Use, duplication or
* disclosure is subject to the terms of an appropriate license
* agreement.
*
* VISUAL NUMERICS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
* SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. VISUAL
* NUMERICS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
* ITS DERIVATIVES.
*--------------------------------------------------------------------------
*/
/*
* EPanel.java
*
* Created on September 14, 2004, 2:46 PM
*/
package com.imsl.demo.heatmaps;
import com.imsl.chart.*;
import com.imsl.stat.Summary;
import java.util.*;
import java.io.*;
import java.awt.event.*;
import java.awt.Color;
public class EPanel extends javax.swing.JPanel implements MouseMotionListener, MouseListener {
private Chart chart;
private AxisXY axis;
private Heatmap heatmap;
private HashMap map;
private ProfilePlot pPlot;
private double[][] data0, data1, data2, plotData;
private double[] range0, range1, range2, plotRange, dateRange, x;
private String plotName;
private boolean showProfile;
private javax.swing.JFrame parentFrame;
private final int xMin = 0;
private final int xMax = 365;
private final int yMin = 0;
private final int yMax = 144;
/** Creates new form EPanel */
public EPanel(javax.swing.JFrame parent) {
this.parentFrame = parent;
initComponents();
setPreferredSize(new java.awt.Dimension(parent.getSize().width, (int)(0.85*parent.getSize().height)));
setChart();
jPanelChart.addMouseMotionListener(this);
jPanelChart.addMouseListener(this);
jPanelChart.setPreferredSize(new java.awt.Dimension(parent.getSize().width, (int)(0.66*parent.getSize().height)));
try {
getData();
} catch (Exception e) {
e.printStackTrace();
}
// compute x values used for profile plots
x = new double[xMax];
for (int i=0; i<xMax; i++) {
x[i] = (new GregorianCalendar(2000, 0, 1+i)).getTimeInMillis();
}
plotData = data0;
update(0);
}
private void setChart() {
chart = jPanelChart.getChart();
axis = new AxisXY(chart);
// Set axis ranges
axis.getAxisX().setAutoscaleInput(AxisXY.AUTOSCALE_OFF);
axis.getAxisY().setAutoscaleInput(AxisXY.AUTOSCALE_OFF);
axis.getAxisY().setWindow(0.0, yMax-1);
axis.getAxisX().getAxisTitle().setTitle("Day of Year");
axis.getAxisY().getAxisTitle().setTitle("Time of Day");
axis.getAxisX().getAxisLabel().setTextFormat(new java.text.SimpleDateFormat("MMM"));
dateRange = new double[] {(new java.util.GregorianCalendar(2000, 0, 1)).getTimeInMillis(),
(new java.util.GregorianCalendar(2000, 11, 31)).getTimeInMillis()};
axis.getAxisX().setWindow(dateRange);
axis.getAxisX().setNumber(6);
axis.getAxisX().setDensity(2);
String yLabels[] = {"00:00","06:00","12:00","18:00","24:00"};
axis.getAxisY().setFirstTick(0);
axis.getAxisY().setTickInterval(36);
axis.getAxisY().getAxisLabel().setLabels(yLabels);
}
// clear and load data sets determined by the menu selection
public void getData() throws IOException, java.text.ParseException {
data0 = new double[xMax][yMax];
data1 = new double[xMax][yMax];
data2 = new double[xMax][yMax];
range0 = new double[] {0,0};
range1 = new double[] {0,0};
range2 = new double[] {0,0};
// read first data set
InputStream is = getClass().getResourceAsStream("temp.csv");
Reader fr = new InputStreamReader(is);
LineNumberReader lnr = new LineNumberReader(fr);
int lineNum = 0;
while (true) {
String line = lnr.readLine();
if (line == null) break;
StringTokenizer st = new StringTokenizer(line,",");
for (int i=0; i<xMax; i++)
data0[i][lineNum] = Double.valueOf(st.nextToken()).doubleValue();
lineNum++;
}
for (int i=0; i<xMax; i++) {
double max = Summary.maximum(data0[i]);
double min = Summary.minimum(data0[i]);
if (min < range0[0]) range0[0] = min;
if (max > range0[1]) range0[1] = max;
}
// read second data set
is = getClass().getResourceAsStream("co.csv");
fr = new InputStreamReader(is);
lnr = new LineNumberReader(fr);
lineNum = 0;
while (true) {
String line = lnr.readLine();
if (line == null) break;
StringTokenizer st = new StringTokenizer(line,",");
for (int i=0; i<xMax; i++)
data1[i][lineNum] = Double.valueOf(st.nextToken()).doubleValue();
lineNum++;
}
for (int i=0; i<xMax; i++) {
double max = Summary.maximum(data1[i]);
double min = Summary.minimum(data1[i]);
if (min < range1[0]) range1[0] = min;
if (max > range1[1]) range1[1] = max;
}
// read third data set
is = getClass().getResourceAsStream("so2.csv");
fr = new InputStreamReader(is);
lnr = new LineNumberReader(fr);
lineNum = 0;
while (true) {
String line = lnr.readLine();
if (line == null) break;
StringTokenizer st = new StringTokenizer(line,",");
for (int i=0; i<xMax; i++)
data2[i][lineNum] = Double.valueOf(st.nextToken()).doubleValue();
lineNum++;
}
for (int i=0; i<xMax; i++) {
double max = Summary.maximum(data2[i]);
double min = Summary.minimum(data2[i]);
if (min < range2[0]) range2[0] = min;
if (max > range2[1]) range2[1] = max;
}
}
// Draw the graph
private void drawGraph() {
if (heatmap != null) {
heatmap.getHeatmapLegend().setPaint(false);
heatmap.remove();
}
heatmap = new Heatmap(axis, dateRange[0], dateRange[1], 0, yMax-1, plotRange[0], plotRange[1], plotData, Colormap.BLUE_GREEN_RED_YELLOW);
heatmap.getHeatmapLegend().setPaint(true);
heatmap.getHeatmapLegend().setTextFormat("##");
heatmap.getHeatmapLegend().setTitle("Value");
}
public void setVisible(boolean show) {
super.setVisible(show);
if (show) {
if (pPlot == null) {
pPlot = new ProfilePlot(parentFrame);
} else {
if (showProfile) {
pPlot.setVisible(true);
}
}
} else {
if (pPlot != null) {
pPlot.setVisible(false);
}
}
}
private void clearProfile() {
pPlot.clearData();
}
private void plotProfile(int xLoc, int yLoc) {
if (!pPlot.isVisible()) pPlot.show();
double[] y = new double[xMax];
for (int i=0; i<xMax; i++) {
y[i] = plotData[i][yLoc];
}
pPlot.draw(x, y, plotRange, getTimeString(yLoc+1), plotName);
}
private String getTimeString(int y) {
int totalMinutes = y*10;
int hours = totalMinutes/60;
int minutes = totalMinutes-hours*60;
java.text.NumberFormat nf = java.text.NumberFormat.getInstance();
nf.setMinimumIntegerDigits(2);
return new String(nf.format(hours)+":"+nf.format(minutes));
}
// Redraw the chart based on radio button selection.
public void update(int dataSet) {
if (dataSet == 0) {
plotData = data0;
plotRange = range0;
plotName = "Temperature, F";
jRadioButton1.setSelected(false);
jRadioButton2.setSelected(false);
}
if (dataSet == 1) {
plotData = data1;
plotRange = range1;
plotName = "Carbon Monoxide, ppm";
jRadioButton0.setSelected(false);
jRadioButton2.setSelected(false);
}
if (dataSet == 2) {
plotData = data2;
plotRange = range2;
plotName = "Sulfur Dioxide, ppm";
jRadioButton0.setSelected(false);
jRadioButton1.setSelected(false);
}
drawGraph();
repaint();
}
private void initComponents() {
jPanelTop = new javax.swing.JPanel();
jPanelLeft = new javax.swing.JPanel();
jPanelRight = new javax.swing.JPanel();
jRadioButton0 = new javax.swing.JRadioButton();
jRadioButton1 = new javax.swing.JRadioButton();
jRadioButton2 = new javax.swing.JRadioButton();
jLabelSelect = new javax.swing.JLabel();
displayText = new javax.swing.JTextArea(6, 20);
jCheckBox = new javax.swing.JCheckBox();
jPanelChart = new com.imsl.chart.JPanelChart();
setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.Y_AXIS));
setPreferredSize(new java.awt.Dimension(500, 600));
jPanelTop.setLayout(new javax.swing.BoxLayout(jPanelTop, javax.swing.BoxLayout.X_AXIS));
jPanelLeft.setLayout(new javax.swing.BoxLayout(jPanelLeft, javax.swing.BoxLayout.Y_AXIS));
jLabelSelect.setText(" Select Data Set: ");
jPanelLeft.add(jLabelSelect);
jRadioButton0.setText("Temperature, F");
jRadioButton0.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
update(0);
}
});
jRadioButton0.setSelected(true);
jPanelLeft.add(jRadioButton0);
jRadioButton1.setText("Carbon Monoxide, ppm");
jRadioButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
update(1);
}
});
jPanelLeft.add(jRadioButton1);
jRadioButton2.setText("Sulfur Dioxide, ppm");
jRadioButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
update(2);
}
});
jPanelLeft.add(jRadioButton2);
jCheckBox.setSelected(false);
jCheckBox.setText("Show Profile");
jCheckBox.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
showProfile = !showProfile;
if ((!showProfile) && (pPlot.isVisible())) {
pPlot.setVisible(false);
repaint();
}
}
});
jPanelRight.add(jCheckBox);
jPanelTop.add(jPanelLeft);
jPanelTop.add(jPanelRight);
add(jPanelTop);
jPanelChart.setPreferredSize(new java.awt.Dimension(500, 500));
add(jPanelChart);
}
// Implement MouseMotionListener
public void mouseMoved(MouseEvent e) {
double user[] = {0,0};
axis.mapDeviceToUser(e.getX(), e.getY(), user);
if ((user[0] < dateRange[0]) || (user[0] > dateRange[1]) ||
(user[1] < yMin) || (user[1] > yMax)) {
if (showProfile) clearProfile();
return;
}
if (showProfile) plotProfile((int)user[0],(int)user[1]);
}
public void mouseDragged(MouseEvent e) {
}
// Implement MouseListener
public void mouseEntered(MouseEvent e) {
if (showProfile)
setCursor(new java.awt.Cursor(java.awt.Cursor.CROSSHAIR_CURSOR));
}
public void mouseExited(MouseEvent e) {
if (showProfile)
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
// Variables declaration
private javax.swing.JLabel jLabelSelect;
private javax.swing.JRadioButton jRadioButton0;
private javax.swing.JRadioButton jRadioButton1;
private javax.swing.JRadioButton jRadioButton2;
private com.imsl.chart.JPanelChart jPanelChart;
private javax.swing.JTextArea displayText;
private javax.swing.JCheckBox jCheckBox;
private javax.swing.JPanel jPanelTop;
private javax.swing.JPanel jPanelLeft;
private javax.swing.JPanel jPanelRight;
// End of variables declaration
}