#ifndef TMDisplayingList_H
#define TMDisplayingList_H

#include "TMDisplayingListNode.h"
#include <list>
#include <Rtypes.h>
#include <fstream.h>

class TMDisplaying;

class TMDisplayingList {
 public:
  static TMDisplayingList* Instance();
  virtual ~TMDisplayingList();

  virtual void          Clear();
  virtual void          AddDisplayingObj(TMDisplaying *disp, UInt_t id, UInt_t plotNr, UInt_t cloneId=0);
  virtual void          RemoveDisplayingObj(UInt_t id, UInt_t plotNr);
  virtual void          RemoveDisplayingObj(UInt_t id, UInt_t plotNr, UInt_t cloneId);
  virtual void          ReducePlotNr(UInt_t id, UInt_t plotNr);
  virtual TMDisplaying* GetDisplayingObj(UInt_t id, UInt_t plotNr, UInt_t cloneId=0);
  virtual Bool_t        Find(UInt_t id, UInt_t plotNr, UInt_t cloneId=0);
  virtual Bool_t        HighLight(UInt_t id, UInt_t plotNr);
  virtual void          SetAutoUpdate(UInt_t id, UInt_t plotNr, UInt_t cloneId=0, Bool_t autoupdate=kTRUE);
  virtual void          SetAutoReset(UInt_t id, UInt_t plotNr, Bool_t autoreset);
  virtual void          SetPaused(UInt_t id, UInt_t plotNr, Bool_t paused);
  virtual void          SetEventMod(UInt_t id, UInt_t plotNr, UInt_t cloneId, UInt_t value);
  virtual void          SetEventModEq(UInt_t id, UInt_t plotNr, UInt_t cloneId, UInt_t value);
  virtual void          ResizeDisplay(UInt_t id, UInt_t plotNr, UInt_t cloneId, Int_t posX, Int_t posY, UInt_t posW, UInt_t posH);

  virtual void UpdateDisplays();
  virtual void UpdateAutoDisplays();
  virtual void UpdateAutoAllDisplays();

  virtual void UpdateDisplayID(UInt_t id, UInt_t plotNr, UInt_t cloneId=0);

  virtual void ScreenShotAll(const Char_t *localDir, const Char_t *extension="gif");

  virtual void ProcessStartRun();
  virtual void ProcessEndRun();

  virtual void SaveEntries(ofstream& sFile);


 protected:
  std::list<TMDisplayingListNode*>  fList;

 private:
  TMDisplayingList();
  static Bool_t instanceFlag;
  static TMDisplayingList *single;
};

#endif
