// @(#)root/ged:$Name:  $:$Id: TH2Editor.h,
// Author: Carsten Hof 08/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_TH2Editor
#define ROOT_TH2Editor

//////////////////////////////////////////////////////////////////////////
//                                                                      //
//  TH2Editor                                                           //
//                                                                      //
//  Editor changing histogram attributes                                //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TGButton
#include "TGWidget.h"
#endif
#ifndef ROOT_TGedFrame
#include "TGedFrame.h"
#endif
#ifndef ROOT_TH2
#include "TH2.h"
#endif

class TH2;
class TGComboBox;
class TGLabel;
class TGTextEntry;
class TGCheckButton;
class TString;
class TGDoubleHSlider;
class TGHSlider;
class TGNumberEntry;
class TGButtonGroup;
class TGHButtonGroup;
class TGRadioButton;
class TGNumberEntryField;
class TGColorSelect;
class TGedPatternSelect;
class TAttFill;
class TGTab;
class TGTextButton;

class TH2Editor : public TGedFrame {

protected:
   TH2                 *fHist;            // histogram object
   TGTab               *fTab;             // Pointer to the Tab Parent
   TGCompositeFrame    *fBin;             // Contains the Binning Widgets
   TGCompositeFrame    *fFit;             // Contains the Fitting Widgets
   TGCompositeFrame    *fBinContainer;             // Container for fBin
   TGTextEntry         *fTitle;           // histogram title input field
   TGComboBox	       *fTypeCombo;       // histogram type combo box
   TGComboBox 	       *fCoordsCombo;     // Coordinate System combo box
   TGComboBox          *fContCombo;       // Contour selecting combo box 
   TGLabel             *fColContLbl;      // No. of Contours Label 1
   TGLabel             *fColContLbl1;     // No. of Contours Label 2   
   Int_t                fTitlePrec;       // font precision level
   TGHButtonGroup      *fDimGroup;        // Radiobuttongroup to change 2D <-> 3D-Plot
   TGRadioButton       *fDim;             // 2D-Plot RadioButton
   TGRadioButton       *fDim0;            // 3D-Plot RadioButton
   TGCompositeFrame    *f3;               // Frame that contains Histogram Type-ComboBox
   TGCompositeFrame    *f4;               // Frame that contains Histogram Coord-ComboBox
   TGCompositeFrame    *f5;               // Frame that contains Histogram Contour-ComboBox
   TGCompositeFrame    *f6;               // Frame that contains the 2D CheckBox DrawOptions
   TGCompositeFrame    *f9;               // Frame that contains the 3D CheckBox DrawOptions   
   TGCompositeFrame    *f12;              // Frame that contains the Bar-Title
   TGCompositeFrame    *f13;              // Frame that contains the Bar Width/Offset NumberEntries
   TGCompositeFrame    *f16;              // Frame that contains the ColorLevel NumberEnrtry
   TGCompositeFrame    *f19;              // Frame that contains the ColorLevel NumberEnrtry   
   TGCompositeFrame    *f38;              // Frame that contains the Frame Fill widgets
   TGCheckButton       *fAddError;        // CheckBox connected to error bars
   TGCheckButton       *fAddPalette;      // CheckBox connected to Z option (2D)
   TGCheckButton       *fAddPalette1;     // CheckBox connected to Z option (3D) 
   TGCheckButton       *fAddArr;          // CheckBox connected to Arr-Option 
   TGCheckButton       *fAddBox;          // CheckBox connected to Box-Option
   TGCheckButton       *fAddScat;         // CheckBox connected to Scat-Option
   TGCheckButton       *fAddCol;          // CheckBox connected to Col-Option  
   TGCheckButton       *fAddFB;           // Draw front box (or not)
   TGCheckButton       *fAddBB;           // Draw back box (or not)
   TGCheckButton       *fAddText;         // Draw bin contents as text
   TGNumberEntry       *fContLevels;      // Set number of contour levels
   TGNumberEntry       *fContLevels1;     // Set number of contour levels   
   TGNumberEntry       *fBarWidth;        // Set bar width of histogram
   TGNumberEntry       *fBarOffset;       // Set bar offset of histogram
   TGCompositeFrame    *fBinXCont;        // Contains the rebin widgets for case 1
   TGHSlider           *fBinXSlider;      // Slider to set rebinning x integer value 
   TGNumberEntryField  *fBinXNumberEntry; // Label which shows the rebinned bin number
   TGHSlider           *fBinYSlider;      // Slider to set rebinning y integer value 
   TGNumberEntryField  *fBinYNumberEntry; // Label which shows the rebinned bin number
   TGTextButton        *fApply;           // Apply-Button to accept the rebinned histogram
   TGTextButton        *fCancel;          // Cancel-Button to reprobate the rebinned histogram
   TGCompositeFrame    *fBinXCont1;       // Contains the X Rebin Widgets for case 2 
   TGHSlider           *fBinXSlider1;     // Slider to set x rebinning integer value 
   TGNumberEntryField  *fBinXNumberEntry1;// Label which shows the rebinned x bin number
   TGNumberEntryField  *fXOffsetNumberEntry; // Shows the offset to the x origin of the histogram
   TGHSlider           *fXBinOffsetSld;   // Add an x-offset to the origin of the histogram

   TGCompositeFrame    *fBinYCont1;       // Contains the Y Rebin Widgets for case 2 
   TGHSlider           *fBinYSlider1;     // Slider to set y rebinning integer value 
   TGNumberEntryField  *fBinYNumberEntry1;// Label which shows the rebinned y bin number
   TGNumberEntryField  *fYOffsetNumberEntry; // Shows the offset to the y origin of the histogram
   TGHSlider           *fYBinOffsetSld;   // Add an y-offset to the origin of the histogram
   TGDoubleHSlider     *fSliderX;         // Slider to set x-axis range
   TGNumberEntryField  *fSldXMin;         // Contains the minimum value of the x-Axis
   TGNumberEntryField  *fSldXMax;         // Contains the maximum value of the x-Axis  
   TGDoubleHSlider     *fSliderY;         // Slider to set y-axis range   
   TGNumberEntryField  *fSldYMin;         // Contains the minimum value of the y-Axis
   TGNumberEntryField  *fSldYMax;         // Contains the maximum value of the y-Axis  
   TGCheckButton       *fDelaydraw;       // Delayed drawing of the new axis range
   TGColorSelect       *fFrameColor;      // Select the Frame Color
   TGedPatternSelect   *fFramePattern;    // Select the Frame Pattern Style
   
   static  TGComboBox *BuildHistTypeComboBox(TGFrame *parent, Int_t id);
   static  TGComboBox *BuildHistCoordsComboBox(TGFrame *parent, Int_t id);
   static  TGComboBox *BuildHistContComboBox(TGFrame* parent, Int_t id);
   
   virtual void ConnectSignals2Slots();

private:
   void PaintBox3D(Float_t *p1, Float_t *p2,Float_t *p3, Float_t *p4);
   TString GetHistTypeLabel();
   TString GetHistCoordsLabel();
   TString GetHistContLabel();
   TString GetHistAdditiveLabel();
/*   virtual void DisconnectAllSlots();   */
   Int_t  fPx1old,fPy1old,fPx2old,fPy2old;
   Float_t fP1oldx[3], 
           fP2oldx[3], 
	   fP3oldx[3], 
	   fP4oldx[3], 
	   fP5oldx[3], 
	   fP6oldx[3], 
	   fP7oldx[3], 
	   fP8oldx[3];
   Float_t fP1oldy[3], 
           fP2oldy[3], 
	   fP3oldy[3], 
	   fP4oldy[3], 
	   fP5oldy[3], 
	   fP6oldy[3], 
	   fP7oldy[3], 
	   fP8oldy[3];
   TH2                 *fBinHist;         // Cloned histogram for rebin
   Double_t             fOldXOffset;      // saves the old x offset of the histogram
   Double_t             fOldYOffset;      // saves the old y offset of the histogram
   
   
public:
   TH2Editor(const TGWindow *p, Int_t id,
               Int_t width = 140, Int_t height = 30,
               UInt_t options = kChildFrame,
               Pixel_t back = GetDefaultFrameBackground());
   virtual ~TH2Editor();
   virtual void   SetModel(TVirtualPad *pad, TObject *obj, Int_t event);

   virtual void DoTitle(const char *text);
   virtual void DoHistSimple();
   virtual void DoHistComplex();
   virtual void DoHistChanges();
   virtual void DoAddArr(Bool_t on);
   virtual void DoAddBox(Bool_t on);
   virtual void DoAddCol(Bool_t on);
   virtual void DoAddScat(Bool_t on);
   virtual void DoAddText(Bool_t on); 
   virtual void DoAddError(Bool_t on);
   virtual void DoAddPalette(Bool_t on);
   virtual void DoAddFB();
   virtual void DoAddBB();
   virtual void DoContLevel();
   virtual void DoContLevel1();   
   virtual void DoBarWidth();
   virtual void DoBarOffset();
   virtual void DoBinPressed();
   virtual void DoBinMoved();      
   virtual void DoBinReleased();
   virtual void DoBinLabel();  
   virtual void DoApply();
   virtual void DoCancel();       
   virtual void DoBinReleased1();
   virtual void DoBinMoved1();   
   virtual void DoBinLabel1();  
   virtual void DoOffsetMoved();
   virtual void DoOffsetReleased();
   virtual void DoOffsetPressed();
   virtual void DoBinOffset();
   virtual void DoSliderXMoved();
   virtual void DoSliderXPressed();
   virtual void DoSliderXReleased();      
   virtual void DoXAxisRange();   
   virtual void DoSliderYMoved();
   virtual void DoSliderYPressed();
   virtual void DoSliderYReleased();      
   virtual void DoYAxisRange();   
   virtual void DoFillColor(Pixel_t);
   virtual void DoFillPattern(Style_t);  
   Int_t* Dividers(Int_t n);
   ClassDef(TH2Editor,0)  // TH2 editor
};

#endif     

