// @(#)root/gui:$Id$
// Author: Fons Rademakers   10/10/2000

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TGProgressBar
#define ROOT_TGProgressBar


#include "TGFrame.h"


class TGProgressBar : public TGFrame {

public:
   enum EBarType { kStandard, kFancy };
   enum EFillType { kSolidFill, kBlockFill };
   enum { kProgressBarStandardWidth = 16, kProgressBarTextWidth = 24,
          kBlockSize = 8, kBlockSpace = 2 };

protected:
   Float_t       fMin;          ///< logical minimum value (default 0)
   Float_t       fMax;          ///< logical maximum value (default 100)
   Float_t       fPos;          ///< logical position [fMin,fMax]
   Int_t         fPosPix;       ///< position of progress bar in pixel coordinates
   Int_t         fBarWidth;     ///< progress bar width
   EFillType     fFillType;     ///< *OPTION={GetMethod="GetFillType";SetMethod="SetFillType";Items=(kSolidFill=Solid",kBlockFill="Block")}*
   EBarType      fBarType;      ///< *OPTION={GetMethod="GetBarType";SetMethod="SetBarType";Items=(kStandard="Standard",kFancy="Fancy")}*
   TString       fFormat;       ///< format used to show position not in percent
   Bool_t        fShowPos;      ///< show position value (default false)
   Bool_t        fPercent;      ///< show position in percent (default true)
   Bool_t        fDrawBar;      ///< if true draw only bar in DoRedraw()
   TGGC          fBarColorGC;   ///< progress bar drawing context
   GContext_t    fNormGC;       ///< text drawing graphics context
   FontStruct_t  fFontStruct;   ///< font used to draw position text

   void DoRedraw() override = 0;

   static const TGFont *fgDefaultFont;
   static TGGC         *fgDefaultGC;

public:
   static FontStruct_t  GetDefaultFontStruct();
   static const TGGC   &GetDefaultGC();

   TGProgressBar(const TGWindow *p, UInt_t w, UInt_t h,
                 Pixel_t back = GetWhitePixel(),
                 Pixel_t barcolor = GetDefaultSelectedBackground(),
                 GContext_t norm = GetDefaultGC()(),
                 FontStruct_t font = GetDefaultFontStruct(),
                 UInt_t options = kDoubleBorder | kSunkenFrame);
   ~TGProgressBar() override { }

   Float_t      GetMin() const { return fMin; }
   Float_t      GetMax() const { return fMax; }
   Float_t      GetPosition() const { return fPos; }
   EFillType    GetFillType() const { return fFillType; }
   EBarType     GetBarType() const { return fBarType; }
   Bool_t       GetShowPos() const { return fShowPos; }
   TString      GetFormat() const { return fFormat; }
   const char*  GetValueFormat() const { return fFormat.Data(); }
   Bool_t       UsePercent() const { return fPercent; }
   Pixel_t      GetBarColor() const { return fBarColorGC.GetForeground(); }
   GContext_t   GetNormGC() const { return fNormGC; }
   FontStruct_t GetFontStruct() const { return fFontStruct; }

   void         SetPosition(Float_t pos);                //*MENU*  *GETTER=GetPosition
   void         SetRange(Float_t min, Float_t max);      //*MENU*
   void         Increment(Float_t inc);
   void         SetBarType(EBarType type);               //*SUBMENU*
   void         SetFillType(EFillType type);             //*SUBMENU*
   virtual void Percent(Bool_t on) { fPercent = on; fClient->NeedRedraw(this); } //*TOGGLE* *GETTER=UsePercent
   virtual void ShowPos(Bool_t on) { fShowPos = on; fClient->NeedRedraw(this); } //*TOGGLE* *GETTER=GetShowPos
   virtual void Format(const char *format = "%.2f");     //*MENU* *GETTER=GetValueFormat
   void         SetMin(Float_t min) { fMin = min; }
   void         SetMax(Float_t max) { fMax = max; }
   virtual void SetBarColor(Pixel_t color);
   void         SetBarColor(const char *color="blue");
   virtual void Reset();                                 //*MENU*
   void         SetForegroundColor(Pixel_t pixel) override;

   void         SavePrimitive(std::ostream &out, Option_t *option = "") override;

   ClassDefOverride(TGProgressBar,0)  // Progress bar abstract base class
};


class TGHProgressBar : public TGProgressBar {

protected:
   void DoRedraw() override;

public:
   TGHProgressBar(const TGWindow *p = nullptr,
                  UInt_t w = 4, UInt_t h = kProgressBarTextWidth,
                  Pixel_t back = GetWhitePixel(),
                  Pixel_t barcolor = GetDefaultSelectedBackground(),
                  GContext_t norm = GetDefaultGC()(),
                  FontStruct_t font = GetDefaultFontStruct(),
                  UInt_t options = kDoubleBorder | kSunkenFrame);
   TGHProgressBar(const TGWindow *p, EBarType type, UInt_t w);
   ~TGHProgressBar() override { }

   TGDimension GetDefaultSize() const override
               { return TGDimension(fWidth, fBarWidth); }

   void ShowPosition(Bool_t set = kTRUE, Bool_t percent = kTRUE,
                     const char *format = "%.2f");

   void SavePrimitive(std::ostream &out, Option_t *option = "") override;

   ClassDefOverride(TGHProgressBar,0)  // Horizontal progress bar widget
};


class TGVProgressBar : public TGProgressBar {

protected:
   void DoRedraw() override;

public:
   TGVProgressBar(const TGWindow *p = nullptr,
                  UInt_t w = kProgressBarTextWidth, UInt_t h = 4,
                  Pixel_t back = GetWhitePixel(),
                  Pixel_t barcolor = GetDefaultSelectedBackground(),
                  GContext_t norm = GetDefaultGC()(),
                  FontStruct_t font = GetDefaultFontStruct(),
                  UInt_t options = kDoubleBorder | kSunkenFrame);
   TGVProgressBar(const TGWindow *p, EBarType type, UInt_t h);
   ~TGVProgressBar() override { }

   TGDimension GetDefaultSize() const override
                { return TGDimension(fBarWidth, fHeight); }
   void SavePrimitive(std::ostream &out, Option_t *option = "") override;
   void ShowPos(Bool_t) override { }
   void Percent(Bool_t) override { }

   ClassDefOverride(TGVProgressBar,0)  // Vertical progress bar widget
};

#endif

