root/src/apps/debuganalyzer/gui/chart/Chart.h
/*
 * 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