// Author: Bertrand Bellenot   22/08/02

/*************************************************************************
 * Copyright (C) 1995-2002, Bertrand Bellenot.                           *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see the LICENSE file.                         *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// This File contains the declaration of the RootShower-class           //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOTSHOWER_H
#define ROOTSHOWER_H

#ifndef ROOT_TGFrame
#include "TGFrame.h"
#endif
#ifndef ROOT_TDatime
#include "TDatime.h"
#endif

class TGMenuBar;
class TGPopupMenu;
class GTitleFrame;
class GButtonFrame;
class TGButton;
class TGListTree;
class TGListTreeItem;
class TRootEmbeddedCanvas;
class TGCanvas;
class TGStatusBar;
class TGTextEdit;
class TGTab;
class TCanvas;
class TPad;
class MyEvent;
class TEnv;
class TTimer;
class TH1F;
class TGToolBar;


extern TGListTree       *gEventListTree;    // Event selection TGListTree
extern TGListTreeItem   *gBaseLTI;          // First ListTree item
extern TGListTreeItem   *gTmpLTI;           // Temporary ListTree item
extern TGListTreeItem   *gLTI[];            // Array of ListTree items (particles)

extern Int_t            gColIndex;          // Global gradient color table used 
                                            // for tracks color

class RootShower: public TGMainFrame {

    friend class SettingsDialog;

private:

    // Statics
    static Int_t        fgDefaultXPosition; // default X position of top left corner
    static Int_t        fgDefaultYPosition; // default Y position of top left corner

    Bool_t              fOk;                // Return code from settings dialog
    Bool_t              fModified;          // kTRUE if setting mods not saved
    Bool_t              fSettingsModified;  // kTRUE if settings have been modified
    Bool_t              fIsRunning;         // Simulation running flag
    Bool_t              fInterrupted;       // Interrupts current simulation
    Bool_t              fShowProcess;       // Display process details
    Bool_t              fCreateGIFs;        // GIFs creation of current event

    ULong_t             fEventNr;           // Event number
    UInt_t              fNRun;              // Run number
    TDatime             fEventTime;         // Event generation date

    Int_t               fPicIndex;          // Index of animation images
    Int_t               fPicNumber;         // Number of images used for animation
    Int_t               fPicDelay;          // Delay between animation images
    Int_t               fPicReset;          // kTRUE to display first anim picture

    TEnv               *fRootShowerEnv;     // RootShower environment variables
    // MenuBar Frame
    TGMenuBar          *fMenuBar;           // Main menu bar
    TGPopupMenu        *fMenuFile;          // "File" popup menu
    TGPopupMenu        *fMenuEvent;         // "Event" popup menu
    TGPopupMenu        *fMenuTools;         // "Tools" popup menu
    TGPopupMenu        *fMenuView;          // "View" popup menu
    TGPopupMenu        *fMenuHelp;          // "Help" popup menu
    TGLayoutHints      *fMenuBarLayout;
    TGLayoutHints      *fMenuBarItemLayout;
    TGLayoutHints      *fMenuBarHelpLayout;
    void                MakeMenuBarFrame();
    void                CloseMenuBarFrame();

    // ToolBar Frame
    TGToolBar          *fToolBar;
    void ShowToolBar(Bool_t show = kTRUE);

    // Layout hints
    TGLayoutHints      *fL1;
    TGLayoutHints      *fL2;
    TGLayoutHints      *fL3;
    TGLayoutHints      *fL4;
    TGLayoutHints      *fL5;
    TGLayoutHints      *fL6;
    TGLayoutHints      *fL7;
    TGLayoutHints      *fL8;

    // Title Frame
    GTitleFrame        *fTitleFrame;        // Title frame

    // Main Frame
    TGCompositeFrame   *fMainFrame;         // Main frame

    // Selection frame
    TGCompositeFrame   *fSelectionFrame;    // Frame containing list tree and button frame
    GButtonFrame       *fButtonFrame;       // Frame containing control buttons
    TGListTreeItem     *AddToTree(const Text_t *name = 0);
    void                BuildEventTree();
    TGCanvas           *fTreeView;          // Canvas containing event selection list tree
    TGListTree         *fEventListTree;     // Event selection TGListTree
    TGListTreeItem     *fCurListItem;       // Current TGlistTreeItem (level) in TGListTree

    // Display frame
    TGTab              *fDisplayFrame;      // TGTab for graphical and text display
    TRootEmbeddedCanvas *fEmbeddedCanvas;   // Events frame
    TRootEmbeddedCanvas *fEmbeddedCanvas2;  // Selected event frame
    TRootEmbeddedCanvas *fEmbeddedCanvas3;  // Statistics frame
    TGTextEdit         *fTextView;          // PDG infos frame

    // Zooming stuff...
    TGHorizontalFrame  *fHFrame,*fHFrame2;  // Frame containing zoom buttons
    TGLayoutHints      *fZoomButtonsLayout; // Layout of zoom buttons
    TGButton           *fZoomPlusButton,*fZoomMoinsButton;  // Zoom buttons
    TGButton           *fZoomPlusButton2,*fZoomMoinsButton2;// Zoom buttons

    // Statusbar
    TGStatusBar        *fStatusBar;         // Status bar reporting event info

    TTimer             *fTimer;             // Timer used for animation
    TCanvas            *fCA;                // Events view
    TCanvas            *fCB;                // Selected event view
    TCanvas            *fCC;                // Statistics
    
    MyEvent            *fEvent;             // Pointer on actual event
    TPad               *fPadC;              // TPad of statistics histo
    
    TH1F               *fHisto_dEdX;        // histogram of particle's energy loss

protected:

    Int_t               fFirstParticle;     // Primary particle type
    Double_t            fE0;                // Initial particle energy
    Double_t            fB;                 // Magnetic field

public:
    // statics
    static void        setDefaultPosition(Int_t x, Int_t y);

    // Constructors & destructor
    RootShower(const TGWindow *p, UInt_t w, UInt_t h);
    virtual ~RootShower();

    void               SetOk(Bool_t ok=true) { fOk = ok; }
    void               Modified(Bool_t modified=true) { fModified = modified; }
    void               SettingsModified(Bool_t modified=true) { fSettingsModified = modified; }
    void               Interrupt(Bool_t inter=true) { fInterrupted = inter; }
    Bool_t             IsInterrupted() { return fInterrupted; }
    virtual void       Initialize(Int_t first);
    virtual void       OnOpenFile(const Char_t *filename);
    virtual void       OnSaveFile(const Char_t *filename);
    virtual void       OnShowerProduce();
    virtual void       produce();
    virtual void       ShowInfos();
    virtual void       HighLight(TGListTreeItem *item);
    virtual void       OnShowSelected(TGListTreeItem *item);
    virtual void       Layout();
    virtual void       CloseWindow();
    virtual Bool_t     HandleConfigureNotify(Event_t *event);
    virtual Bool_t     HandleKey(Event_t *event);
    virtual Bool_t     ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2);
    virtual Bool_t     HandleTimer(TTimer *);
    virtual Int_t      DistancetoPrimitive(Int_t px, Int_t py);

};

extern RootShower   *gRootShower;

#endif // EMSHOWER_H
