⛏️ index : haiku.git

/*
 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef CHART_H
#define CHART_H

#include <View.h>

#include <ObjectList.h>

#include "chart/ChartDataRange.h"
#include "chart/ChartDefs.h"


class ChartAxis;
class ChartDataSource;
class ChartRenderer;
class ChartRendererDataSourceConfig;


class Chart : public BView {
public:
								Chart(ChartRenderer* renderer,
									const char* name = NULL);
	virtual						~Chart();

			bool				AddDataSource(ChartDataSource* dataSource,
									int32 index,
									ChartRendererDataSourceConfig* config
										= NULL);
			bool				AddDataSource(ChartDataSource* dataSource,
									ChartRendererDataSourceConfig* config
										= NULL);
			bool				RemoveDataSource(
									ChartDataSource* dataSource);
			ChartDataSource*	RemoveDataSource(int32 index);
			void				RemoveAllDataSources();

			void				SetAxis(ChartAxisLocation location,
									ChartAxis* axis);

	inline	ChartDataRange		Domain() const;
	inline	ChartDataRange		Range() const;

	inline	ChartDataRange		DisplayDomain() const;
	inline	ChartDataRange		DisplayRange() const;

			void				SetDisplayDomain(ChartDataRange domain);
			void				SetDisplayRange(ChartDataRange range);

			double				DomainZoomLimit() const;
			void				SetDomainZoomLimit(double limit);

	virtual	void				DomainChanged();
	virtual	void				RangeChanged();

	virtual	void				MessageReceived(BMessage* message);

	virtual	void				MouseDown(BPoint where);
	virtual	void				MouseUp(BPoint where);
	virtual	void				MouseMoved(BPoint where, uint32 code,
									const BMessage* dragMessage);
	virtual	void				FrameResized(float newWidth, float newHeight);
	virtual	void				Draw(BRect updateRect);
	virtual	void				ScrollTo(BPoint where);

	virtual	BSize				MinSize();
	virtual	BSize				MaxSize();
	virtual	BSize				PreferredSize();

	virtual	void				DoLayout();

private:
			typedef BObjectList<ChartDataSource> DataSourceList;

			struct AxisInfo {
				ChartAxis*		axis;
				BRect			frame;

								AxisInfo();
				void			SetFrame(float left, float top, float right,
									float bottom);
				void			SetRange(const ChartDataRange& range);
				void			Render(BView* view, const BRect& updateRect);
			};

private:
			void				_UpdateDomainAndRange();
			void				_UpdateScrollBar(bool horizontal);
			void				_ScrollTo(float value, bool horizontal);
			void				_Zoom(float x, float steps);

private:
			ChartRenderer*		fRenderer;
			DataSourceList		fDataSources;
			AxisInfo			fLeftAxis;
			AxisInfo			fTopAxis;
			AxisInfo			fRightAxis;
			AxisInfo			fBottomAxis;
			ChartDataRange		fDomain;
			ChartDataRange		fRange;
			ChartDataRange		fDisplayDomain;
			ChartDataRange		fDisplayRange;
			BRect				fChartFrame;
			float				fHScrollSize;
			float				fVScrollSize;
			float				fHScrollValue;
			float				fVScrollValue;
			int32				fIgnoreScrollEvent;
			double				fDomainZoomLimit;
			BPoint				fLastMousePos;
			BPoint				fDraggingStartPos;
			float				fDraggingStartScrollValue;
};


ChartDataRange
Chart::Domain() const
{
	return fDomain;
}


ChartDataRange
Chart::Range() const
{
	return fRange;
}


ChartDataRange
Chart::DisplayDomain() const
{
	return fDisplayDomain;
}


ChartDataRange
Chart::DisplayRange() const
{
	return fDisplayRange;
}


#endif	// CHART_H