359 lines
13 KiB
Java
359 lines
13 KiB
Java
/*
|
|
* To change this template, choose Tools | Templates
|
|
* and open the template in the editor.
|
|
*/
|
|
|
|
/*
|
|
* GraphPropertiesPanel.java
|
|
*
|
|
* Created on Mar 16, 2010, 8:30:56 AM
|
|
*/
|
|
|
|
package ch.psi.plot.plot.xy;
|
|
|
|
import java.awt.Color;
|
|
import java.awt.Paint;
|
|
import java.util.logging.Logger;
|
|
|
|
import org.jfree.chart.axis.LogarithmicAxis;
|
|
import org.jfree.chart.axis.NumberAxis;
|
|
import org.jfree.chart.plot.XYPlot;
|
|
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
|
|
import org.jfree.data.xy.XYSeries;
|
|
import org.jfree.data.xy.XYSeriesCollection;
|
|
|
|
import ch.psi.plot.plot.done.LinePlot;
|
|
import ch.psi.plot.plot.done.LinePlotData;
|
|
|
|
|
|
|
|
/**
|
|
*
|
|
* @author studer_a1
|
|
*/
|
|
public class GraphPropertiesPanel extends javax.swing.JPanel {
|
|
|
|
/**
|
|
*
|
|
*/
|
|
private static final long serialVersionUID = 1L;
|
|
private static Logger logger = Logger.getLogger(GraphPropertiesPanel.class.getName());
|
|
|
|
private XYSeries xySeries;
|
|
private XYLineAndShapeRenderer renderer;
|
|
private XYPlot plot;
|
|
private int seriesNumber;
|
|
private int xyDataSetOffset;
|
|
LinePlot singlePlot = null;
|
|
|
|
/** Creates new form GraphPropertiesPanel */
|
|
public GraphPropertiesPanel(XYPlot plot, XYSeries xySeries, int seriesNumber) {
|
|
this.plot = plot;
|
|
this.xySeries = xySeries;
|
|
this.renderer = (XYLineAndShapeRenderer) plot.getRenderer();
|
|
this.seriesNumber = seriesNumber;
|
|
this.xyDataSetOffset = plot.getDatasetCount();
|
|
|
|
initComponents();
|
|
initFields();
|
|
}
|
|
|
|
public void initFields(){
|
|
nameLabel.setText(xySeries.getKey().toString());
|
|
colorLabel.setOpaque(true);
|
|
colorLabel.setBackground((Color) renderer.getSeriesPaint(seriesNumber));
|
|
plotCheckBox.setSelected(renderer.isSeriesVisible(seriesNumber));
|
|
singleCheckBox.setSelected(false);
|
|
logCheckBox.setSelected(false);
|
|
minTextField.setText(new Double(xySeries.getMinY()).toString());
|
|
maxTextField.setText(new Double(xySeries.getMaxY()).toString());
|
|
}
|
|
|
|
/**
|
|
* Creates a single plot out of an xySeries, destroys the plot if singleCheckBox.isSelected() is false
|
|
*/
|
|
public void createSinglePlotUsingSeries(){
|
|
LinePlotData d = new LinePlotData();
|
|
((XYSeriesCollection) d.getData()).addSeries(xySeries);
|
|
//use the same paint as in the original
|
|
Paint paint = renderer.getSeriesPaint(seriesNumber);
|
|
singlePlot = new LinePlot(xySeries.getKey().toString(), d);
|
|
// there is only one series in this plot, so we choose index 0 to assign paint
|
|
singlePlot.getChartPanel().getChart().getXYPlot().getRenderer().setSeriesPaint(0, paint);
|
|
singlePlot.plot(false);
|
|
//check whether we want a log scale
|
|
if(logCheckBox.isSelected()){
|
|
final NumberAxis rangeAxis = new LogarithmicAxis("Log");
|
|
((LogarithmicAxis)rangeAxis).setAllowNegativesFlag(true);
|
|
singlePlot.getChartPanel().getChart().getXYPlot().setRangeAxis(rangeAxis);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* creates a dataset with a single xySerie
|
|
* @return
|
|
*/
|
|
public XYSeriesCollection wrapSeriesInDataSet(){
|
|
XYSeriesCollection wrappedSeries = new XYSeriesCollection();
|
|
wrappedSeries.addSeries(xySeries);
|
|
return wrappedSeries;
|
|
|
|
}
|
|
|
|
/**
|
|
* creates an additional range (y) scale for a series (identified by its name)
|
|
* lowerbound and upperbound are taken from user input.
|
|
* @param name
|
|
* @param lowerBound
|
|
* @param upperBound
|
|
* @return
|
|
*/
|
|
public NumberAxis createIndivdualRangeScale(String name, double lowerBound, double upperBound){
|
|
NumberAxis individualRangeScale = new NumberAxis(name);
|
|
individualRangeScale.setLowerBound(lowerBound);
|
|
individualRangeScale.setUpperBound(upperBound);
|
|
return individualRangeScale;
|
|
|
|
}
|
|
|
|
/**
|
|
* makes the individual range scale visible
|
|
*/
|
|
public void applyIndividualRangeScale(){
|
|
double lowerBound = 0.0;
|
|
double upperBound = 0.0;
|
|
try {
|
|
lowerBound = Double.parseDouble(minTextField.getText());
|
|
upperBound = Double.parseDouble(maxTextField.getText());
|
|
} catch (NumberFormatException e) {
|
|
logger.warning("invalid bounds");
|
|
return;
|
|
}
|
|
|
|
//create new dataset and axis
|
|
NumberAxis individualRangeScale = createIndivdualRangeScale(
|
|
xySeries.getKey().toString(),lowerBound, upperBound);
|
|
individualRangeScale.setLabelPaint(renderer.getSeriesPaint(seriesNumber));
|
|
individualRangeScale.setTickLabelPaint(renderer.getSeriesPaint(seriesNumber));
|
|
individualRangeScale.setAxisLinePaint(renderer.getSeriesPaint(seriesNumber));
|
|
plot.setRangeAxis(seriesNumber + xyDataSetOffset, individualRangeScale);
|
|
plot.setDataset(seriesNumber + xyDataSetOffset, wrapSeriesInDataSet());
|
|
plot.mapDatasetToRangeAxis(seriesNumber + xyDataSetOffset, seriesNumber + xyDataSetOffset);
|
|
XYLineAndShapeRenderer individualRenderer = new XYLineAndShapeRenderer();
|
|
//StandardXYItemRenderer individualRenderer = new StandardXYItemRenderer();
|
|
individualRenderer.setSeriesPaint(0, renderer.getSeriesPaint(seriesNumber));
|
|
individualRenderer.setSeriesShape(0, renderer.getSeriesShape(seriesNumber));
|
|
plot.setRenderer(seriesNumber + xyDataSetOffset, individualRenderer);
|
|
|
|
//set original series invisible
|
|
renderer.setSeriesVisible(seriesNumber, false);
|
|
|
|
}
|
|
|
|
/**
|
|
* removes the individual range scale
|
|
*/
|
|
public void removeIndividualRangeScale(){
|
|
//we remove axis and dataset and renderer
|
|
plot.setRangeAxis(seriesNumber + xyDataSetOffset, null);
|
|
plot.setDataset(seriesNumber + xyDataSetOffset, null);
|
|
plot.setRenderer(seriesNumber + xyDataSetOffset, null);
|
|
if(plotCheckBox.isSelected()){
|
|
renderer.setSeriesVisible(seriesNumber, true);
|
|
//renderer.setSer
|
|
}
|
|
}
|
|
|
|
private void initComponents() {
|
|
|
|
nameLabel = new javax.swing.JLabel();
|
|
colorLabel = new javax.swing.JLabel();
|
|
plotCheckBox = new javax.swing.JCheckBox();
|
|
singleCheckBox = new javax.swing.JButton();
|
|
logCheckBox = new javax.swing.JCheckBox();
|
|
minTextField = new javax.swing.JTextField();
|
|
maxTextField = new javax.swing.JTextField();
|
|
individualRangeScaleCheckBox = new javax.swing.JCheckBox();
|
|
|
|
singleCheckBox.setText("Show");
|
|
nameLabel.setText("name");
|
|
|
|
colorLabel.setText(" ");
|
|
|
|
plotCheckBox.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
plotCheckBoxActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
singleCheckBox.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
createSinglePlotUsingSeries();
|
|
}
|
|
});
|
|
|
|
logCheckBox.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
logCheckBoxActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
minTextField.setText("min");
|
|
minTextField.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
minTextFieldActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
maxTextField.setText("max");
|
|
maxTextField.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
maxTextFieldActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
individualRangeScaleCheckBox.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
individualRangeScaleCheckBoxActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
|
this.setLayout(layout);
|
|
layout.setHorizontalGroup(
|
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addComponent(nameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 103, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addGap(58, 58, 58)
|
|
.addComponent(colorLabel)
|
|
.addGap(50, 50, 50)
|
|
.addComponent(plotCheckBox)
|
|
.addGap(30, 30, 30)
|
|
.addComponent(singleCheckBox)
|
|
.addGap(30, 30, 30)
|
|
.addComponent(logCheckBox)
|
|
.addGap(28, 28, 28)
|
|
.addComponent(individualRangeScaleCheckBox)
|
|
.addGap(49, 49, 49)
|
|
.addComponent(minTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addGap(18, 18, 18)
|
|
.addComponent(maxTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addContainerGap(106, Short.MAX_VALUE))
|
|
);
|
|
layout.setVerticalGroup(
|
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addComponent(logCheckBox)
|
|
.addComponent(singleCheckBox)
|
|
.addComponent(plotCheckBox)
|
|
.addComponent(nameLabel)
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(minTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addComponent(maxTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addGap(6, 6, 6)
|
|
.addComponent(colorLabel))
|
|
.addComponent(individualRangeScaleCheckBox))
|
|
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
);
|
|
}// </editor-fold>//GEN-END:initComponents
|
|
|
|
private void plotCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_plotCheckBoxActionPerformed
|
|
if(plotCheckBox.isSelected()){
|
|
//if an individual scale exists, set this one visible
|
|
//if(plot.getRenderer(seriesNumber + xyDataSetOffset) != null){
|
|
if(individualRangeScaleCheckBox.isSelected()){
|
|
//The following should always be true, if not, there is a (logical) problem
|
|
if(plot.getRenderer(seriesNumber + xyDataSetOffset) != null){
|
|
plot.getRenderer(seriesNumber + xyDataSetOffset).setSeriesVisible(0, true);
|
|
}
|
|
}
|
|
else{
|
|
//set the other one invisible
|
|
renderer.setSeriesVisible(seriesNumber, true);
|
|
}
|
|
}
|
|
else{
|
|
//set individual range dataset and series invisible (if exists)
|
|
renderer.setSeriesVisible(seriesNumber, false);
|
|
if(plot.getRenderer(seriesNumber + xyDataSetOffset) != null){
|
|
plot.getRenderer(seriesNumber + xyDataSetOffset).setSeriesVisible(0, false);
|
|
}
|
|
|
|
}
|
|
}//GEN-LAST:event_plotCheckBoxActionPerformed
|
|
|
|
|
|
private void logCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_logCheckBoxActionPerformed
|
|
// TODO add your handling code here:
|
|
}//GEN-LAST:event_logCheckBoxActionPerformed
|
|
|
|
private void minTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_minTextFieldActionPerformed
|
|
double lowerBound = 0.0;
|
|
|
|
if(individualRangeScaleCheckBox.isSelected()){
|
|
if(plot.getRangeAxis(seriesNumber + xyDataSetOffset) != null){
|
|
try {
|
|
lowerBound = Double.parseDouble(minTextField.getText());
|
|
} catch (NumberFormatException e) {
|
|
logger.warning("invalid lower bound");
|
|
return;
|
|
}
|
|
if(lowerBound >= plot.getRangeAxis(seriesNumber + xyDataSetOffset).getUpperBound()){
|
|
logger.warning("lower bound >= upper bound");
|
|
}
|
|
else{
|
|
plot.getRangeAxis(seriesNumber + xyDataSetOffset).setLowerBound(lowerBound);
|
|
}
|
|
}
|
|
}
|
|
}//GEN-LAST:event_minTextFieldActionPerformed
|
|
|
|
private void maxTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_maxTextFieldActionPerformed
|
|
double upperBound = 0.0;
|
|
|
|
if(individualRangeScaleCheckBox.isSelected()){
|
|
if(plot.getRangeAxis(seriesNumber + xyDataSetOffset) != null){
|
|
try {
|
|
upperBound = Double.parseDouble(maxTextField.getText());
|
|
} catch (NumberFormatException e) {
|
|
logger.warning("invalid upper bound");
|
|
return;
|
|
}
|
|
if(upperBound <= plot.getRangeAxis(seriesNumber + xyDataSetOffset).getLowerBound()){
|
|
logger.warning("upper bound <= lower bound");
|
|
}
|
|
else{
|
|
plot.getRangeAxis(seriesNumber + xyDataSetOffset).setUpperBound(upperBound);
|
|
}
|
|
}
|
|
}
|
|
|
|
}//GEN-LAST:event_maxTextFieldActionPerformed
|
|
|
|
private void individualRangeScaleCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_individualRangeScaleCheckBoxActionPerformed
|
|
if(individualRangeScaleCheckBox.isSelected()){
|
|
applyIndividualRangeScale();
|
|
}
|
|
else{
|
|
removeIndividualRangeScale();
|
|
}
|
|
}//GEN-LAST:event_individualRangeScaleCheckBoxActionPerformed
|
|
|
|
|
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
|
private javax.swing.JLabel colorLabel;
|
|
private javax.swing.JCheckBox individualRangeScaleCheckBox;
|
|
private javax.swing.JCheckBox logCheckBox;
|
|
private javax.swing.JTextField maxTextField;
|
|
private javax.swing.JTextField minTextField;
|
|
private javax.swing.JLabel nameLabel;
|
|
private javax.swing.JCheckBox plotCheckBox;
|
|
private javax.swing.JButton singleCheckBox;
|
|
// End of variables declaration//GEN-END:variables
|
|
|
|
}
|