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

 ********************************************************************************/
 
#ifndef _H_J2DVectorData
#define _H_J2DVectorData

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

class J2DVectorData : public JPlotDataBase
{
public:

	static JBoolean	Create( J2DVectorData** plotData,
							const JArray<JFloat>& x,  const JArray<JFloat>& y,
							const JArray<JFloat>& vx, const JArray<JFloat>& vy,
							const JBoolean listen);

	static JBoolean	OKToCreate( const JArray<JFloat>& x,  const JArray<JFloat>& y,
								const JArray<JFloat>& vx, const JArray<JFloat>& vy);

	virtual ~J2DVectorData();

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

	virtual void		GetXRange(JFloat* min, JFloat* max) const;
	virtual JBoolean	GetYRange(const JFloat xMin, const JFloat xMax,
								  JFloat* yMin, JFloat* yMax) const;

	void	IgnoreDataChanges();

	const JArray<JFloat>* GetXData() const;
	const JArray<JFloat>* GetYData() const;
	const JArray<JFloat>* GetVXData() const;
	const JArray<JFloat>* GetVYData() const;

protected:

	J2DVectorData(const JArray<JFloat>& x,  const JArray<JFloat>& y,
				  const JArray<JFloat>& vx, const JArray<JFloat>& vy,
				  const JBoolean listen);

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

private:

	JArray<J2DVectorPoint>*	itsData;

	// NULL if not listening; not owned

	const JArray<JFloat>* itsOrigXData;
	const JArray<JFloat>* itsOrigYData;
	const JArray<JFloat>* itsOrigVXData;
	const JArray<JFloat>* itsOrigVYData;

private:

	void	UpdateData();

	// not allowed

	J2DVectorData(const J2DVectorData& source);
	const J2DVectorData& operator=(const J2DVectorData& source);
};

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

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

inline const JArray<JFloat>*
J2DVectorData::GetXData()
	const
{
	return itsOrigXData;
}

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

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

inline const JArray<JFloat>*
J2DVectorData::GetYData()
	const
{
	return itsOrigYData;
}

/*********************************************************************************
 GetVXData

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

inline const JArray<JFloat>*
J2DVectorData::GetVXData()
	const
{
	return itsOrigVXData;
}

/*********************************************************************************
 GetVYData

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

inline const JArray<JFloat>*
J2DVectorData::GetVYData()
	const
{
	return itsOrigVYData;
}


#endif
