#ifndef ROOT_TVirtualPad
#define ROOT_TVirtualPad

//+SEQ,CopyRight,T=NOINCLUDE.

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TVirtualPad                                                          //
//                                                                      //
// Abstract base class for Pads and Canvases                            //
//                                                                      //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TAttPad
//*KEEP,TAttPad.
#include "TAttPad.h"
//*KEND.
#endif

#ifndef ROOT_TVirtualX
//*KEEP,TVirtualX.
#include "TVirtualX.h"
//*KEND.
#endif

#ifndef ROOT_TString
//*KEEP,TString.
#include "TString.h"
//*KEND.
#endif

#ifndef ROOT_Buttons
//*KEEP,Buttons,T=C++.
#include "Buttons.h"
//*KEND.
#endif

// forward declarations
class TObject;
class TObjLink;
class TView;
class TCanvas;
class TPadView3D;
class TH1F;
class TFrame;
class TBox;

class TVirtualPad : public TObject, public TAttLine, public TAttFill, public TAttPad {

protected:
   Bool_t       fResizing;        //!true when resizing the pad

public:
   TVirtualPad();
   TVirtualPad(const Text_t *name, const Text_t *title, Float_t xlow,
               Float_t ylow, Float_t xup, Float_t yup,
               Color_t color=19, Short_t bordersize=4, Short_t bordermode=1);
   virtual ~TVirtualPad();
   virtual void     AbsCoordinates(Bool_t set) = 0;
   virtual Float_t  AbsPixeltoX(Int_t px) = 0;
   virtual Float_t  AbsPixeltoY(Int_t py) = 0;
   virtual void     cd(Int_t subpadnumber=0) = 0;
   virtual void     Clear(Option_t *option="") = 0;
   virtual void     Close(Option_t *option="") = 0;
   virtual void     CopyPixmap() = 0;
   virtual void     CopyPixmaps() = 0;
   virtual void     Divide(Int_t nx=1, Int_t ny=1, Float_t xmargin=0.01, Float_t ymargin=0.01, Int_t color=0) = 0;
   virtual void     Draw(Option_t *option="") = 0;
   virtual void     DrawClassObject(TObject *obj, Option_t *option="") = 0;
   virtual TH1F    *DrawFrame(Float_t xmin, Float_t ymin, Float_t xmax, Float_t ymax, const Text_t *title="") = 0;
   virtual void     DrawLine(Float_t x1, Float_t y1, Float_t x2, Float_t y2) = 0;
   virtual void     DrawLineNDC(Float_t u1, Float_t v1, Float_t u2, Float_t v2) = 0;
   virtual void     DrawText(Float_t x, Float_t y, const Text_t *text) = 0;
   virtual void     DrawTextNDC(Float_t u, Float_t v, const Text_t *text) = 0;
   virtual Short_t  GetBorderMode() = 0;
   virtual Short_t  GetBorderSize() = 0;
   virtual Int_t    GetCanvasID() const = 0;
   virtual TCanvas  *GetCanvas() = 0;
   virtual TVirtualPad *GetVirtCanvas() = 0;
   virtual Int_t    GetEvent() const  = 0;
   virtual Int_t    GetEventX() const = 0;
   virtual Int_t    GetEventY() const = 0;
   virtual TFrame   *GetFrame() = 0;
   virtual Color_t  GetHighLightColor() const = 0;
   virtual void     GetRange(Float_t &x1, Float_t &y1, Float_t &x2, Float_t &y2) = 0;
   virtual void     GetRangeAxis(Axis_t &xmin, Axis_t &ymin, Axis_t &xmax, Axis_t &ymax) = 0;
   virtual void     GetPadPar(Float_t &xlow, Float_t &ylow, Float_t &xup, Float_t &yup) = 0;
   virtual Float_t  GetXlowNDC() = 0;
   virtual Float_t  GetYlowNDC() = 0;
   virtual Float_t  GetWNDC() = 0;
   virtual Float_t  GetHNDC() = 0;
   virtual UInt_t   GetWw() = 0;
   virtual UInt_t   GetWh() = 0;
   virtual Float_t  GetAbsXlowNDC() = 0;
   virtual Float_t  GetAbsYlowNDC() = 0;
   virtual Float_t  GetAbsWNDC() = 0;
   virtual Float_t  GetAbsHNDC() = 0;
   virtual Float_t  GetPhi() = 0;
   virtual Float_t  GetTheta() = 0;
   virtual Float_t  GetUxmin() = 0;
   virtual Float_t  GetUymin() = 0;
   virtual Float_t  GetUxmax() = 0;
   virtual Float_t  GetUymax() = 0;
   virtual Bool_t   GetGridx() = 0;
   virtual Bool_t   GetGridy() = 0;
   virtual Int_t    GetTickx() = 0;
   virtual Int_t    GetTicky() = 0;
   virtual Float_t  GetX1() const = 0;
   virtual Float_t  GetX2() const = 0;
   virtual Float_t  GetY1() const = 0;
   virtual Float_t  GetY2() const = 0;
   virtual TList    *GetListOfPrimitives() = 0;
   virtual TObject  *GetPrimitive(const Text_t *name) = 0;
   virtual TObject  *GetSelected() = 0;
   virtual TObject  *GetPadPointer() = 0;
   virtual TVirtualPad  *GetPadSave() const = 0;
   virtual TVirtualPad  *GetSelectedPad() const = 0;
   virtual TView    *GetView() = 0;
   virtual Int_t    GetLogx() = 0;
   virtual Int_t    GetLogy() = 0;
   virtual Int_t    GetLogz() = 0;
   virtual TVirtualPad  *GetMother() = 0;
   virtual const Text_t *GetName() const = 0;
   virtual const Text_t *GetTitle() const = 0;
   virtual Int_t    GetPadPaint() = 0;
   virtual Int_t    GetPixmapID() = 0;
   virtual TPadView3D *GetView3D() = 0;
   virtual void     HighLight(Color_t col=kRed, Bool_t set=kTRUE) = 0;
   virtual void     InspectObject(TObject *obj) = 0;
   virtual Bool_t   IsBatch() = 0;
   Bool_t           IsBeingResized() const { return fResizing; }
   virtual Bool_t   IsEditable() = 0;
   virtual Bool_t   IsModified() = 0;
   virtual Bool_t   IsRetained() = 0;
   virtual void     ls(Option_t *option="") = 0;
   virtual void     Modified(Bool_t flag=1) = 0;
   virtual Bool_t   OpaqueMoving() const = 0;
   virtual Bool_t   OpaqueResizing() const = 0;
   virtual Float_t  PadtoX(Axis_t x) const = 0;
   virtual Float_t  PadtoY(Axis_t y) const = 0;
   virtual void     Paint(Option_t *option="") = 0;
   virtual void     PaintBorderPS(Float_t xl,Float_t yl,Float_t xt,Float_t yt,Int_t bmode,Int_t bsize,Int_t dark,Int_t light) = 0;
   virtual void     PaintBox(Float_t x1, Float_t y1, Float_t x2, Float_t y2, Option_t *option="") = 0;
   virtual void     PaintFillArea(Int_t n, Float_t *x, Float_t *y, Option_t *option="") = 0;
   virtual void     PaintPadFrame(Float_t xmin, Float_t ymin, Float_t xmax, Float_t ymax) = 0;
   virtual void     PaintLine(Float_t x1, Float_t y1, Float_t x2, Float_t y2) = 0;
   virtual void     PaintLineNDC(Coord_t u1, Coord_t v1,Coord_t u2, Coord_t v2) = 0;
   virtual void     PaintLine3D(Float_t *p1, Float_t *p2) = 0;
   virtual void     PaintPolyLine(Int_t n, Float_t *x, Float_t *y, Option_t *option="") = 0;
   virtual void     PaintPolyLine3D(Int_t n, Float_t *p) = 0;
   virtual void     PaintPolyLineNDC(Int_t n, Float_t *x, Float_t *y, Option_t *option="") = 0;
   virtual void     PaintPolyMarker(Int_t n, Float_t *x, Float_t *y, Option_t *option="") = 0;
   virtual void     PaintModified() = 0;
   virtual void     PaintText(Float_t x, Float_t y, const Text_t *text) = 0;
   virtual void     PaintTextNDC(Float_t u, Float_t v, const Text_t *text) = 0;
   virtual Float_t  PixeltoX(Int_t px) = 0;
   virtual Float_t  PixeltoY(Int_t py) = 0;
   virtual void     Pop() = 0;
   virtual void     Print(const Text_t *filename="") = 0;
   virtual void     Print(const Text_t *filename, Option_t *option) = 0;
   virtual void     Range(Float_t x1, Float_t y1, Float_t x2, Float_t y2) = 0;
   virtual void     RangeAxis(Axis_t xmin, Axis_t ymin, Axis_t xmax, Axis_t ymax) = 0;
   virtual void     RecursiveRemove(TObject *obj) = 0;
   virtual void     RedrawAxis(Option_t *option="") = 0;
   virtual void     ResetView3D(TPadView3D *view=0) = 0;
   virtual void     ResizePad(Option_t *option="") = 0;
   virtual void     SaveAs(const Text_t *filename="") = 0;
   virtual void     SetBatch(Bool_t batch=kTRUE) = 0;
   virtual void     SetBorderMode(Short_t bordermode) = 0;
   virtual void     SetBorderSize(Short_t bordersize) = 0;
   virtual void     SetCanvasSize(UInt_t ww, UInt_t wh) = 0;
   virtual void     SetCursor(ECursor cursor) = 0;
   virtual void     SetDoubleBuffer(Int_t mode=1) = 0;
   virtual void     SetEditable(Bool_t mode=kTRUE) = 0;
   virtual void     SetGrid(Int_t valuex = 1, Int_t valuey = 1) = 0;
   virtual void     SetGridx(Int_t value = 1) = 0;
   virtual void     SetGridy(Int_t value = 1) = 0;
   virtual void     SetLogx(Int_t value = 1) = 0;
   virtual void     SetLogy(Int_t value = 1) = 0;
   virtual void     SetLogz(Int_t value = 1) = 0;
   virtual void     SetPad(const Text_t *name, const Text_t *title,
                           Float_t xlow, Float_t ylow, Float_t xup,
                           Float_t yup, Color_t color=35,
                           Short_t bordersize=5, Short_t bordermode=-1) = 0;
   virtual void     SetPad(Float_t xlow, Float_t ylow, Float_t xup, Float_t yup) = 0;
   virtual void     SetAttFillPS(Color_t color, Style_t style) = 0;
   virtual void     SetAttLinePS(Color_t color, Style_t style, Width_t lwidth) = 0;
   virtual void     SetAttMarkerPS(Color_t color, Style_t style, Size_t msize) = 0;
   virtual void     SetAttTextPS(Int_t align, Float_t angle, Color_t color, Style_t font, Float_t tsize) = 0;
   virtual void     SetName(const Text_t *name) = 0;
   virtual void     SetSelected(TObject *obj) = 0;
   virtual void     SetTicks(Int_t valuex = 1, Int_t valuey = 1) = 0;
   virtual void     SetTickx(Int_t value = 1) = 0;
   virtual void     SetTicky(Int_t value = 1) = 0;
   virtual void     SetTitle(const Text_t *title="") = 0;
   virtual void     SetTheta(Float_t theta=30) = 0;
   virtual void     SetPhi(Float_t phi=30) = 0;
   virtual void     SetToolTipText(const char *text, Long_t delayms = 1000) = 0;
   virtual void     SetView(TView *view) = 0;
   virtual void     Update() = 0;
   virtual Int_t    UtoAbsPixel(Float_t u) const = 0;
   virtual Int_t    VtoAbsPixel(Float_t v) const = 0;
   virtual Int_t    UtoPixel(Float_t u) const = 0;
   virtual Int_t    VtoPixel(Float_t v) const = 0;
   virtual Int_t    XtoAbsPixel(Axis_t x) const = 0;
   virtual Int_t    YtoAbsPixel(Axis_t y) const = 0;
   virtual Float_t  XtoPad(Axis_t x) const = 0;
   virtual Float_t  YtoPad(Axis_t y) const = 0;
   virtual Int_t    XtoPixel(Axis_t x) const = 0;
   virtual Int_t    YtoPixel(Axis_t y) const = 0;

   virtual TObject   *CreateToolTip(const TBox *b, const char *text, Long_t delayms) = 0;
   virtual void       DeleteToolTip(TObject *tip) = 0;
   virtual void       ResetToolTip(TObject *tip) = 0;
   virtual void       CloseToolTip(TObject *tip) = 0;

   virtual void     x3d(Option_t *option="") = 0;

   ClassDef(TVirtualPad,1)  //Abstract base class for Pads and Canvases
};

#ifdef R__THREAD

R__EXTERN TVirtualPad *gPadMain;
#ifndef __CINT__
R__EXTERN void **(*gThreadTsd)(void*,Int_t);
#endif
R__EXTERN int (*gThreadXAR)(char *xact, Int_t nb, void **ar, Int_t *iret);
#define gPad (*((!gThreadTsd)? &gPadMain:(TVirtualPad**)(*gThreadTsd)(&gPadMain,0)))

#else
R__EXTERN TVirtualPad *gPad;
#endif

#endif