/*
* $Id: SimpleTuple.java,v 1.7 2003/08/22 23:02:38 dwd Exp $
*
* This software is provided by NOAA for full, free and open release. It is
* understood by the recipient/user that NOAA assumes no liability for any
* errors contained in the code. Although this software is released without
* conditions or restrictions in its use, it is expected that appropriate
* credit be given to its author and to the National Oceanic and Atmospheric
* Administration should the software be included by the recipient as an
* element in other product development.
*/
package sgtplot.dm;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import sgtplot.SGLabel;
import sgtplot.util.GeoDate;
import sgtplot.util.GeoDateArray;
import sgtplot.util.Range2D;
import sgtplot.util.SoTRange;
/**
* SimpleTuple provides an implementation of the
* SGTTuple and Cartesian interfaces.
*
* @author Donald Denbo
* @version $Revision: 1.7 $, $Date: 2003/08/22 23:02:38 $
* @since 2.x
* @see SGTTuple
* @see Cartesian
*/
public class SimpleTuple implements Cloneable, SGTTuple, Cartesian, Serializable {
private boolean xTime_ = false;
private boolean yTime_ = false;
private String title_ = null;
private SGLabel keyTitle_ = null;
private String id_ = null;
private double[] xArray_ = null;
private double[] yArray_ = null;
// private GeoDate[] tArray_ = null;
private GeoDateArray tArray_ = null;
private double[] zArray_ = null;
private double[] assocArray_ = null;
/**
* @link aggregation
* @clientRole x
*/
protected SGTMetaData xMetaData_ = null;
/**
* @link aggregation
* @clientRole y
*/
protected SGTMetaData yMetaData_ = null;
/**
* @link aggregation
* @clientRole z*/
protected SGTMetaData zMetaData_ = null;
private SoTRange xRange_ = null;
private SoTRange yRange_ = null;
private Range2D zRange_ = null;
private PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
public SimpleTuple(double[] xArray, double[] yArray, String title) {
xArray_ = xArray;
yArray_ = yArray;
xTime_ = false;
yTime_ = false;
title_ = title;
xRange_ = computeSoTRange(xArray);
yRange_ = computeSoTRange(yArray);
}
public SimpleTuple(GeoDate[] xArray, double[] yArray, String title) {
tArray_ = new GeoDateArray(xArray);
yArray_ = yArray;
xTime_ = true;
yTime_ = false;
title_ = title;
xRange_ = computeSoTRange(tArray_);
yRange_ = computeSoTRange(yArray);
}
public SimpleTuple(double[] xArray, GeoDate[] yArray, String title) {
xArray_ = xArray;
tArray_ = new GeoDateArray(yArray);
xTime_ = false;
yTime_ = true;
title_ = title;
xRange_ = computeSoTRange(xArray);
yRange_ = computeSoTRange(tArray_);
}
public SimpleTuple(double[] xArray, double[] yArray,
double[] zArray, String title) {
xArray_ = xArray;
yArray_ = yArray;
zArray_ = zArray;
xTime_ = false;
yTime_ = false;
title_ = title;
xRange_ = computeSoTRange(xArray);
yRange_ = computeSoTRange(yArray);
zRange_ = computeRange2D(zArray);
}
public SimpleTuple(GeoDate[] xArray, double[] yArray,
double[] zArray, String title) {
tArray_ = new GeoDateArray(xArray);
yArray_ = yArray;
zArray_ = zArray;
xTime_ = true;
yTime_ = false;
title_ = title;
xRange_ = computeSoTRange(tArray_);
yRange_ = computeSoTRange(yArray);
zRange_ = computeRange2D(zArray);
}
public SimpleTuple(double[] xArray, GeoDate[] yArray,
double[] zArray, String title) {
xArray_ = xArray;
tArray_ = new GeoDateArray(yArray);
zArray_ = zArray;
xTime_ = false;
yTime_ = true;
title_ = title;
xRange_ = computeSoTRange(xArray);
yRange_ = computeSoTRange(tArray_);
zRange_ = computeRange2D(zArray);
}
public SimpleTuple() {
xTime_ = false;
yTime_ = false;
}
public double[] getXArray() {
return xArray_;
}
public void setXArray(double[] xArray) {
xArray_ = xArray;
xTime_ = false;
xRange_ = computeSoTRange(xArray);
changes_.firePropertyChange("dataModified",
new Integer(0),
new Integer(xArray.length));
}
public void setXArray(GeoDate[] tArray) {
setXArray(new GeoDateArray(tArray));
}
/**
* @since 3.0
*/
public void setXArray(GeoDateArray tArray) {
tArray_ = tArray;
xTime_ = true;
xArray_ = null;
xRange_ = computeSoTRange(tArray);
changes_.firePropertyChange("dataModified",
new Integer(0),
new Integer(tArray.getLength()));
}
public double[] getYArray() {
return yArray_;
}
public void setYArray(double[] yArray) {
yArray_ = yArray;
yTime_ = false;
yRange_ = computeSoTRange(yArray);
changes_.firePropertyChange("dataModified",
new Integer(0),
new Integer(yArray.length));
}
public void setYArray(GeoDate[] tArray) {
setYArray(new GeoDateArray(tArray));
}
/**
* @since 3.0
*/
public void setYArray(GeoDateArray tArray) {
tArray_ = tArray;
yTime_ = true;
yArray_ = null;
yRange_ = computeSoTRange(tArray);
changes_.firePropertyChange("dataModified",
new Integer(0),
new Integer(tArray.getLength()));
}
public double[] getZArray() {
return zArray_;
}
public void setZArray(double[] zArray) {
zArray_ = zArray;
zRange_ = computeRange2D(zArray);
changes_.firePropertyChange("dataModified",
new Integer(0),
new Integer(zArray.length));
}
public int getSize() {
if(xTime_) {
return tArray_.getLength();
} else {
return xArray_.length;
}
}
public GeoDate[] getTimeArray() {
return tArray_.getGeoDate();
}
/**
* @since 3.0
*/
public GeoDateArray getGeoDateArray() {
return tArray_;
}
public double[] getAssociatedData() {
return assocArray_;
}
public void setAssociatedData(double[] assocArray) {
assocArray_ = assocArray;
}
public boolean hasAssociatedData() {
return (assocArray_ != null);
}
public SGTMetaData getZMetaData() {
return zMetaData_;
}
public void setZMetaData(SGTMetaData zMeta) {
zMetaData_ = zMeta;
}
public String getTitle() {
return title_;
}
public void setTitle(String title) {
title_ = title;
}
public SGLabel getKeyTitle() {
return keyTitle_;
}
public void setKeyTitle(SGLabel title) {
keyTitle_ = title;
}
public String getId() {
return id_;
}
public void setId(String id) {
id_ = id;
}
public SGTData copy() {
SGTTuple newTuple;
try {
newTuple = (SGTTuple)clone();
} catch (CloneNotSupportedException e) {
newTuple = new SimpleTuple();
}
return (SGTData)newTuple;
}
public boolean isXTime() {
return xTime_;
}
public boolean isYTime() {
return yTime_;
}
public SGTMetaData getXMetaData() {
return xMetaData_;
}
public void setXMetaData(SGTMetaData xMeta) {
xMetaData_ = xMeta;
}
public SGTMetaData getYMetaData() {
return yMetaData_;
}
public void setYMetaData(SGTMetaData yMeta) {
yMetaData_ = yMeta;
}
public SoTRange getXRange() {
return xRange_;
}
public SoTRange getYRange() {
return yRange_;
}
public Range2D getZRange() {
return zRange_;
}
public void addPropertyChangeListener(PropertyChangeListener l) {
changes_.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
changes_.removePropertyChangeListener(l);
}
private SoTRange computeSoTRange(double[] array) {
Range2D range = computeRange2D(array);
return new SoTRange.Double(range.start, range.end);
}
private SoTRange computeSoTRange(GeoDateArray tarray) {
long start = Long.MAX_VALUE;
long end = Long.MIN_VALUE;
long[] tar = tarray.getTime();
int count = 0;
for(int i=0; i < tar.length; i++) {
if(!(tar[i] == Long.MAX_VALUE)) {
start = Math.min(start, tar[i]);
end = Math.max(end, tar[i]);
count++;
}
}
if(count == 0) {
return new SoTRange.Time(Long.MAX_VALUE,
Long.MAX_VALUE);
} else {
return new SoTRange.Time(start, end);
}
}
private Range2D computeRange2D(double[] array) {
double start = Double.POSITIVE_INFINITY;
double end = Double.NEGATIVE_INFINITY;
int count = 0;
for(int i=0; i < array.length; i++) {
if(!Double.isNaN(array[i])) {
start = Math.min(start, array[i]);
end = Math.max(end, array[i]);
count++;
}
}
if(count == 0) {
return new Range2D(Double.NaN, Double.NaN);
} else {
return new Range2D(start, end);
}
}
}
Ads help maintain this website.