/*********************************************************************************
 J2DPlotData.h
 
	Interface for the J2DPlotData class.
 
	Copyright @ 1997 by Glenn W. Bach. All rights reserved.

 ********************************************************************************/
 
#ifndef _H_J2DPlotData
#define _H_J2DPlotData

#include <JPlotDataBase.h>
#include <JArray.h>

class J2DPlotData : public JPlotDataBase
{
public:
	
	static JBoolean Create(J2DPlotData **plotData, 
							const JArray<JFloat>& x, const JArray<JFloat>& y,
							JBoolean listen);
	
	static JBoolean OKToCreate(const JArray<JFloat>& x, const JArray<JFloat>& y);
		
	virtual ~J2DPlotData();

	virtual void GetElement(const JIndex index, J2DDataPoint* data) const;

	JBoolean SetXErrors(JArray<JFloat>& xErr);
	JBoolean SetXErrors(JArray<JFloat>& xPErr, JArray<JFloat>& xMErr);

	JBoolean SetYErrors(JArray<JFloat>& yErr);
	JBoolean SetYErrors(JArray<JFloat>& yPErr, JArray<JFloat>& yMErr);

	virtual void		GetXRange(JFloat* min, JFloat* max) const;
	virtual JBoolean	GetYRange(const JFloat xMin, const JFloat xMax,
								  JFloat* yMin, JFloat* yMax) const;
	void IgnoreDataChanges();
	virtual JBoolean HasXErrors() const;
	virtual JBoolean HasYErrors() const;
	virtual JBoolean HasSymmetricXErrors() const;
	virtual JBoolean HasSymmetricYErrors() const;
	JBoolean IsValid() const;

	const JArray<JFloat>* GetXData() const;
	const JArray<JFloat>* GetYData() const;
	JBoolean GetXErrorData(const JArray<JFloat>** testArray) const;
	JBoolean GetXMErrorData(const JArray<JFloat>** testArray) const;
	JBoolean GetYErrorData(const JArray<JFloat>** testArray) const;
	JBoolean GetYMErrorData(const JArray<JFloat>** testArray) const;

	JBoolean IsListening() const;
	JBoolean ArrayInData(JArray<JFloat>*) const;

protected:

	J2DPlotData(const JArray<JFloat>& x, const JArray<JFloat>& y, 
					const JBoolean listen = kFalse);

	JFloat GetXMax() const;
	JFloat GetXMin() const;
	JFloat GetYMax() const;
	JFloat GetYMin() const;

	virtual void	Receive(JBroadcaster* sender, const Message& message);

private:

	JArray<JFloat>* itsXData;
	JArray<JFloat>* itsXPErrorData;
	JArray<JFloat>* itsXMErrorData;
	JArray<JFloat>* itsYData;
	JArray<JFloat>* itsYPErrorData;
	JArray<JFloat>* itsYMErrorData;

	JBoolean itsIsValid;
	JBoolean itsIsListening;
	JBoolean itsHasXErrors;
	JBoolean itsHasYErrors;
	JBoolean itsXErrorsSymmetric;
	JBoolean itsYErrorsSymmetric;

	JFloat itsCurrentXMax;
	JFloat itsCurrentXMin;
	JFloat itsCurrentYMax;
	JFloat itsCurrentYMin;

private:

	void ValidateCurve();
};


/*********************************************************************************
 HasXErrors

 ********************************************************************************/

inline JBoolean
J2DPlotData::HasXErrors()
	const
{
	return itsHasXErrors;
}

/*********************************************************************************
 HasYErrors

 ********************************************************************************/

inline JBoolean
J2DPlotData::HasYErrors()
	const
{
	return itsHasYErrors;
}

/*********************************************************************************
 HasSymmetricXErrors

 ********************************************************************************/

inline JBoolean
J2DPlotData::HasSymmetricXErrors()
	const
{
	return itsXErrorsSymmetric;
}

/*********************************************************************************
 HasSymmetricYErrors

 ********************************************************************************/

inline JBoolean
J2DPlotData::HasSymmetricYErrors()
	const
{
	return itsYErrorsSymmetric;
}

/*********************************************************************************
 IsValid

 ********************************************************************************/

inline JBoolean
J2DPlotData::IsValid()
	const
{
	return itsIsValid;
}

/*********************************************************************************
 GetXData

 ********************************************************************************/

inline const JArray<JFloat>*
J2DPlotData::GetXData()
	const
{
	return itsXData;
}

/*********************************************************************************
 GetYData

 ********************************************************************************/

inline const JArray<JFloat>*
J2DPlotData::GetYData()
	const
{
	return itsYData;
}

/*********************************************************************************
 GetXErrorData

 ********************************************************************************/

inline JBoolean
J2DPlotData::GetXErrorData
	(
	const JArray<JFloat>** testArray
	)
	const
{
	if (itsHasXErrors)
		{
		*testArray = itsXPErrorData;
		return kTrue;
		}
	return kFalse;
}

/*********************************************************************************
 GetXMErrorData

 ********************************************************************************/

inline JBoolean
J2DPlotData::GetXMErrorData
	(
	const JArray<JFloat>** testArray
	)
	const
{
	if (itsHasXErrors && !itsXErrorsSymmetric)
		{
		*testArray = itsXMErrorData;
		return kTrue;
		}
	return kFalse;
}

/*********************************************************************************
 GetYErrorData

 ********************************************************************************/

inline JBoolean
J2DPlotData::GetYErrorData
	(
	const JArray<JFloat>** testArray
	)
	const
{
	if (itsHasYErrors)
		{
		*testArray = itsYPErrorData;
		return kTrue;
		}
	return kFalse;
}

/*********************************************************************************
 GetYMErrorData

 ********************************************************************************/

inline JBoolean
J2DPlotData::GetYMErrorData
	(
	const JArray<JFloat>** testArray
	)
	const
{
	if (itsHasYErrors && !itsYErrorsSymmetric)
		{
		*testArray = itsYMErrorData;
		return kTrue;
		}
	return kFalse;
}

/*********************************************************************************
 IsListening

 ********************************************************************************/

inline JBoolean
J2DPlotData::IsListening()
	const
{
	return itsIsListening;
}

/*********************************************************************************
 ArrayInData

 ********************************************************************************/

inline JBoolean
J2DPlotData::ArrayInData
	(
	JArray<JFloat>* testArray
	)
	const
{
	return JI2B(testArray == itsXData || testArray == itsYData ||
				testArray == itsXPErrorData || testArray == itsXMErrorData ||
				testArray == itsYPErrorData || testArray == itsYMErrorData);
}

#endif
