// @(#)root/ged:$Id$
// Author: Carsten Hof 16/08/04

/*************************************************************************
 * Copyright (C) 1995-2004, 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_TH1Editor
#define ROOT_TH1Editor


#include "TGedFrame.h"


class TH1;
class TGComboBox;
class TGNumberEntry;
class TGCheckButton;
class TGButtonGroup;
class TGHButtonGroup;
class TString;
class TGRadioButton;
class TGDoubleHSlider;
class TGHSlider;
class TGTextEntry;
class TGNumberEntryField;
class TGTextButton;

class TH1Editor : public TGedFrame {

protected:
   TH1                 *fHist;            ///< histogram object
   Bool_t               fSameOpt;         ///< flag for option "same"
   TGCompositeFrame    *fBin;             ///< Contains the Binning Widgets
   Int_t                fTitlePrec;       ///< font precision level
   TGTextEntry         *fTitle;           ///< histogram title input field
   TGHButtonGroup      *fDimGroup;        ///< Radiobuttongroup to change 2D <-> 3D-Plot
   TGRadioButton       *fDim;             ///< 2D-Plot RadioButton
   TGRadioButton       *fDim0;            ///< 3D-Plot RadioButton
   TGLayoutHints       *fDimlh;           ///< layout hints for 2D-Plot RadioButton
   TGLayoutHints       *fDim0lh;          ///< layout hints for 3D-Plot RadioButton
   TGComboBox          *fTypeCombo;       ///< histogram type combo box
   TGComboBox          *fCoordsCombo;     ///< Coordinate System combo box
   TGComboBox          *fErrorCombo;      ///< Error combo box
   TGCheckButton       *fHistOnOff;       ///< Draw a simple histogram with default options
   TGCheckButton       *fAddMarker;       ///< Draw a Marker on top of each bin
   TGCheckButton       *fAddB;            ///< Draw a Bar Chart
   TGCheckButton       *fAddBar;          ///< Bar Option
   TGCheckButton       *fAdd;             ///< Activate more Options
   TGCheckButton       *fMakeHBar;        ///< Draw Horizontal Bar Chart
   TGCheckButton       *fAddSimple;       ///< Draw a simple histogram  (==HIST draw option)
   TGNumberEntry       *fBarWidth;        ///< Change the Bar Width
   TGNumberEntry       *fBarOffset;       ///< Change the Bar Offset
   TGComboBox          *fAddCombo;        ///< Add Lines, Bars, Fill
   TGComboBox          *fPercentCombo;    ///< Percentage of the Bar which is drawn in a different color
   TGCompositeFrame    *f3;               ///< Contains Histogram Type
   TGCompositeFrame    *f6;               ///< Contains the Add-ComboBox (Style)
   TGCompositeFrame    *f7;               ///< Contains the Marker OnOff CheckBox
   TGCompositeFrame    *f8;               ///< Contains the Bar Chart CheckBox
   TGCompositeFrame    *f9;               ///< Contains the Bar Option CheckBox
   TGCompositeFrame    *f10;              ///< Contains the Bar Option Title
   TGCompositeFrame    *f11;              ///< Contains the Bar Width/Offset NumberEntries
   TGCompositeFrame    *f12;              ///< Contains fPercentCombo, fMakeHBar
   TGCompositeFrame    *f15;              ///< Contains outer line CheckBox
   TGCompositeFrame    *fBinCont;         ///< Contains the Rebin Widgets for case 1
   TGCompositeFrame    *fBinCont1;        ///< Contains the Rebin Widgets for case 2
   TGHSlider           *fBinSlider;       ///< Slider to set rebinning integer value
   TGHSlider           *fBinSlider1;      ///< Slider to set rebinning integer value for ntuple histogram
   TGNumberEntryField  *fBinNumberEntry;  ///< Label which shows the rebinned bin number
   TGNumberEntryField  *fBinNumberEntry1; ///< Label which shows the rebinned bin number for ntuple histogram
   TGHSlider           *fBinOffsetSld;    ///< Add an offset to the origin of the histogram
   TGNumberEntryField  *fOffsetNumberEntry;///< Shows the offset to the origin of the histogram
   TGDoubleHSlider     *fSlider;          ///< Slider to set x-axis range
   TGNumberEntryField  *fSldMin;          ///< Contains the minimum value of the x-Axis
   TGNumberEntryField  *fSldMax;          ///< Contains the maximum value of the x-Axis
   TGCheckButton       *fDelaydraw;       ///< Delayed drawing of the new axis range
   TGTextButton        *fApply;           ///< Apply-Button to accept the rebinned histogram
   TGTextButton        *fCancel;          ///< Cancel-Button to reprobate the rebinned histogram

   static  TGComboBox *BuildHistTypeComboBox(TGFrame *parent, Int_t id);       // builts the Type ComboBox
   static  TGComboBox *BuildHistCoordsComboBox(TGFrame *parent, Int_t id);     // builts the Coordinate ComboBox
   static  TGComboBox *BuildHistErrorComboBox(TGFrame *parent, Int_t id);      // builts the Error ComboBox
   static  TGComboBox *BuildHistAddComboBox(TGFrame *parent, Int_t id);        // builts the Add ComboBox
   static  TGComboBox *BuildPercentComboBox(TGFrame *parent, Int_t id);        // builts the ComboBox for setting the Bar options bar1,..., bar4

   virtual void  ConnectSignals2Slots();   // connect the signals to the slots
   void CreateBinTab();                           // Creates the Bin Tab (part of the SetGedEditor)


private:
   Bool_t               fMake;            // Veto Variable
   Bool_t               fMakeB;           // avoid execution of Bar Slots
   Int_t                fPx1old,          // save the coordinates of the "virtual box" in delay draw mode (2D Plot)
                        fPy1old,
                        fPx2old,
                        fPy2old;
   Float_t              fP1NDCold[3],     // save the coordinates of the "virtual box" in delay draw mode
                        fP2NDCold[3],
                        fP3NDCold[3],
                        fP4NDCold[3];
   Float_t              fP1old[3],        // save the coordinates of the "virtual box" in delay draw mode (3D plot)
                        fP2old[3],
                        fP3old[3],
                        fP4old[3],
                        fP5old[3],
                        fP6old[3],
                        fP7old[3],
                        fP8old[3];
   TH1                 *fBinHist;         // Cloned histogram for rebin
   Double_t             fOldOffset;       // save the old offset of the histogram

   TString              GetHistTypeLabel();       // Get the Histogram Type = String which contains the Histogram Draw Option
   TString              GetHistCoordsLabel();     // Get the histogram coordinate system (CYL, SPH, PSR, ..)
   TString              GetHistErrorLabel();      // Get the histogram Error type (E1, .., E4)
   TString              GetHistAddLabel();        // Get the histogram addon (smooth line, simple line, ..)
   void ChangeErrorCombo(Int_t i);


public:
   TH1Editor(const TGWindow *p = nullptr,
               Int_t width = 140, Int_t height = 30,
               UInt_t options = kChildFrame,
               Pixel_t back = GetDefaultFrameBackground());
   ~TH1Editor() override;

   Bool_t AcceptModel(TObject* model) override;
   void   SetModel(TObject* obj) override;

   virtual void DoTitle(const char *text);
   virtual void DoAddMarker(Bool_t on);
   virtual void DoAddBar(Bool_t);
   virtual void DoAddB(Bool_t);
   virtual void DoAddSimple(Bool_t on);
   virtual void DoHistSimple();
   virtual void DoHistComplex();
   virtual void DoHistChanges();
   virtual void DoHistView();
   virtual void DoBarOffset();
   virtual void DoBarWidth();
   virtual void DoPercent();
   virtual void DoHBar(Bool_t on);
   virtual void DoSliderMoved();
   virtual void DoSliderPressed();
   virtual void DoSliderReleased();
   virtual void DoAxisRange();
   virtual void DoBinMoved(Int_t number);
   virtual void DoBinReleased();
   virtual void DoBinPressed();
   virtual void DoBinLabel();
   virtual void DoBinReleased1();
   virtual void DoBinMoved1();
   virtual void DoBinLabel1();
   virtual void DoOffsetMoved(Int_t num);
   virtual void DoOffsetReleased();
   virtual void DoOffsetPressed();
   virtual void DoBinOffset();
   virtual void DoApply();
   virtual void DoCancel();
   virtual void PaintBox3D(Float_t *p1, Float_t *p2,Float_t *p3, Float_t *p4);
   Int_t* Dividers(Int_t n);
   void RecursiveRemove(TObject* obj) override;


   ClassDefOverride(TH1Editor,0)  // TH1 editor
};

#endif
