/*
Plot Graphic Library,
a C++/MFC charting library.

  Copyright (C) 2001  de Halleux Jonathan

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

Contact: de Halleux Jonathan, pglinfo@patabelgos.org
*/
// viewGL2D.h: interface for the CPGLView2D class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_PGLVIEW2D_H__338966CB_1C93_11D4_8D89_00409503B978__INCLUDED_)
#define AFX_PGLVIEW2D_H__338966CB_1C93_11D4_8D89_00409503B978__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "PGLView.h"

/*! \brief A 2D view.

\ingroup PGLViewGroup
  This type of view is used for 2D graphs or drawings. 
It can handle basic mouse
events, such as zooming and panning
*/
class PGL_EXT_CLASS CPGLView2D : public CPGLView
{
DECLARE_SERIAL(CPGLView2D);

public:
    /**@name Class Members*/
    //@{
    /// default constructor
    CPGLView2D(double _m_dLeft=0.0,double _right=1.0,double _top=1.0,double _bottom=0.0);
    /// copy constructor
    CPGLView2D(const CPGLView2D& v2D);
    /// assignement constructor
    CPGLView2D& operator = (const CPGLView2D& v2D);
    /// destructor
    virtual ~CPGLView2D()
    {};

    /// init all the OpenGL states (blending, culling, smoothing, stipple, etc...)
    void InitGLState();
    /** reconstruct the projection matrice and model matrice
    The new viewport is defined by \_tx, \_tx, \_width et \_height
    */  
    void Reshape();
    /// pans the view of x (resp. y) pixels horizontaly (resp. verticaly)
    void Pan(int x,int y);
    /// zooms in of 25\%
    void ZoomIn();
    /// zooms out of 25\%
    void ZoomOut();
    /// zooms the box defined by the 2 points $(xStart, yStart, xEnd, yEnd)$
    void ZoomBox(int xStart,int yStart,int xEnd,int yEnd);
  //  void DrawBackground(){glRectf((GLfloat)m_dLeft, (GLfloat)m_dBottom, (GLfloat)m_dRight, (GLfloat)m_dTop);};
    /// change the project plane to \_left, \_right, \_top and \_bottom
    void ZoomAll(double _dLeft,double _dRight, double _dBottom, double _dTop);
    /// Plot to Encapsulated postscript
    void PlotGfx(gfxinterface::CGfxInterface& gfx);

    /// coordinate transformation
    double PixelToWorld(int iaxe, int pix);
    double PixelToWorldCoord(int iaxe, int pix);
    double PixelToWorld(int iaxe, double pix);
    double PixelToWorldCoord(int iaxe, double pix);

    double GetLeft() const
    {    return m_dLeft;}
    double GetRight() const
    {    return m_dRight;}
    double GetBottom() const
    {    return m_dBottom;}
    double GetTop() const
    {    return m_dTop;}

    /// Serialization
    void Serialize( CArchive& archive );

    /// Debuggin functions
#ifdef _DEBUG
    virtual void Dump( CDumpContext& dc ) const;
    virtual void AssertValid() const;    // Override
#endif
    //@}
protected:
    /**@name Class Parameter*/
    //@{
    /// left limit of the viewport
    double m_dLeft;
    /// right limit of the viewport
    double m_dRight;
    /// top limit of the viewport
    double m_dTop;
    /// bottom limit of the viewport
    double m_dBottom;
    //@}
};

#endif // !defined(AFX_VIEW2DCLASS1_H__338966CB_1C93_11D4_8D89_00409503B978__INCLUDED_)