Files
ch.psi.plot/ch.psi.plot/tmp/xy/GraphPropertiesPanel.java
T

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
}