12 #ifndef ROOT_TRecorder 
   13 #define ROOT_TRecorder 
  135 class TGPictureButton;
 
  138 class TRecorderState;
 
  152 class TRecEvent : 
public TObject
 
  166    virtual void ReplayEvent(Bool_t showMouseCursor = kTRUE) = 0;
 
  169    virtual ERecEventType GetType() 
const = 0;
 
  171    virtual TTime GetTime()
 const {
 
  176    virtual void SetTime(TTime t) {
 
  181    ClassDef(TRecEvent,1) 
 
  194 class TRecCmdEvent : 
public TRecEvent
 
  204    void SetText(
const char *text) {
 
  209    const char *GetText()
 const {
 
  214    virtual ERecEventType GetType()
 const {
 
  216       return TRecEvent::kCmdEvent;
 
  219    virtual void ReplayEvent(Bool_t) {
 
  221       std::cout << GetText() << std::endl;
 
  222       gApplication->ProcessLine(GetText());
 
  225    ClassDef(TRecCmdEvent,1) 
 
  236 class TRecExtraEvent : 
public TRecEvent
 
  246    void SetText(TString text) {
 
  251    TString GetText()
 const {
 
  256    virtual ERecEventType GetType()
 const {
 
  258       return TRecEvent::kExtraEvent;
 
  261    virtual void ReplayEvent(Bool_t) {
 
  264       gApplication->ProcessLine(GetText());
 
  267    ClassDef(TRecExtraEvent,1) 
 
  279 class TRecGuiEvent : 
public TRecEvent
 
  282    friend class TRecorderInactive;
 
  283    friend class TRecorderPaused;
 
  284    friend class TRecorderRecording;
 
  285    friend class TRecorderReplaying;
 
  310    enum EConfigureNotifyType {
 
  318       kWM_DELETE_WINDOW = 10001,
 
  319       kROOT_MESSAGE     = 10002
 
  322    virtual ERecEventType GetType()
 const {
 
  324       return TRecEvent::kGuiEvent;
 
  327    virtual void    ReplayEvent(Bool_t showMouseCursor = kTRUE);
 
  328    static Event_t *CreateEvent(TRecGuiEvent *ge);
 
  330    ClassDef(TRecGuiEvent,1) 
 
  347 class TRecWinPair : 
public TObject
 
  350    friend class TRecorderReplaying;
 
  357    TRecWinPair(Window_t key, Window_t value): fKey(key), fValue(value) {}
 
  359    ClassDef(TRecWinPair,1) 
 
  422 class TRecorder : 
public TObject
 
  425    TRecorderState *fRecorderState;   
 
  427    TRecorder(
const TRecorder&);            
 
  428    TRecorder &operator=(
const TRecorder&); 
 
  431    friend class TRecorderState;
 
  432    friend class TRecorderInactive;
 
  433    friend class TRecorderPaused;
 
  434    friend class TRecorderRecording;
 
  435    friend class TRecorderReplaying;
 
  440    void  ChangeState(TRecorderState *newstate, Bool_t deletePreviousState = kTRUE);
 
  449    enum ERecorderState {
 
  458    TRecorder(
const char *filename, Option_t *option = 
"READ");
 
  461    virtual ~TRecorder();
 
  463    void Browse(TBrowser *);
 
  466    void Start(
const char *filename, Option_t *option = 
"RECREATE", Window_t *w = 0, Int_t winCount = 0);
 
  469    void Stop(Bool_t guiCommand = kFALSE);
 
  472    Bool_t Replay(
const char *filename, Bool_t showMouseCursor = kTRUE, TRecorder::EReplayModes mode = kRealtime);
 
  475    void Replay() { Replay(fFilename); }   
 
  487    void ListCmd(
const char *filename);
 
  490    void ListGui(
const char *filename);
 
  493    virtual TRecorder::ERecorderState GetState() 
const;
 
  496    void PrevCanvases(
const char *filename, Option_t *option);
 
  498    ClassDef(TRecorder,2) 
 
  519    friend class TRecorder;
 
  520    void ChangeState(TRecorder *r, TRecorderState *s, Bool_t deletePreviousState) { r->ChangeState(s, deletePreviousState); }
 
  523    virtual ~TRecorderState() {}
 
  524    virtual void   Start(TRecorder *, 
const char *, Option_t *, Window_t *, Int_t) {}
 
  525    virtual void   Stop(TRecorder *, Bool_t ) {}
 
  526    virtual Bool_t Replay(TRecorder *, 
const char *, Bool_t, TRecorder::EReplayModes) { 
return false; }
 
  527    virtual void   Pause(TRecorder *) {}
 
  528    virtual void   Resume(TRecorder *) {}
 
  529    virtual void   ReplayStop(TRecorder *) {}
 
  531    virtual void   ListCmd(
const char *) {}
 
  532    virtual void   ListGui(
const char *) {}
 
  534    virtual void   PrevCanvases(
const char *, Option_t *) {}
 
  536    virtual TRecorder::ERecorderState GetState() 
const = 0;
 
  538    ClassDef(TRecorderState, 0) 
 
  552 class TRecorderReplaying : 
public TRecorderState
 
  555    virtual  ~TRecorderReplaying();
 
  556    Bool_t   PrepareNextEvent();
 
  557    Bool_t   RemapWindowReferences();
 
  560    Bool_t   FilterEvent(TRecGuiEvent *e);
 
  562    TRecorder  *fRecorder;  
 
  579    TRecGuiEvent   *fGuiEvent;       
 
  580    TRecCmdEvent   *fCmdEvent;       
 
  581    TRecExtraEvent *fExtraEvent;     
 
  583    Int_t       fRegWinCounter;      
 
  584    Int_t       fGuiTreeCounter;     
 
  585    Int_t       fCmdTreeCounter;     
 
  586    Int_t       fExtraTreeCounter;   
 
  588    Int_t       fWinTreeEntries;     
 
  594    TRecEvent  *fNextEvent;          
 
  596    TTime       fPreviousEventTime;  
 
  599    Bool_t      fWaitingForWindow;   
 
  605    Bool_t      fEventReplayed;      
 
  611    Bool_t      fShowMouseCursor;    
 
  613    Bool_t      fFilterStatusBar;    
 
  616    friend class TRecorderInactive;
 
  617    friend class TRecorderPaused;
 
  619    TRecorderReplaying(
const char *filename);
 
  620    Bool_t     Initialize(TRecorder *r, Bool_t showMouseCursor, TRecorder::EReplayModes mode);
 
  623    virtual TRecorder::ERecorderState GetState()
 const { 
return TRecorder::kReplaying; }
 
  625    virtual void   Pause(TRecorder *r);
 
  626    virtual void   Continue();
 
  627    virtual void   ReplayStop(TRecorder *r);
 
  629    void           RegisterWindow(Window_t w);   
 
  630    void           ReplayRealtime();             
 
  632    ClassDef(TRecorderReplaying, 0) 
 
  644 class TRecorderRecording: 
public TRecorderState
 
  647    virtual ~TRecorderRecording();
 
  648    Bool_t  IsFiltered(Window_t 
id);
 
  649    void    SetTypeOfConfigureNotify(Event_t *e);
 
  650    void    CopyEvent(Event_t *e, Window_t wid);
 
  652    TRecorder          *fRecorder;         
 
  666    TRecGuiEvent       *fGuiEvent;         
 
  667    TRecCmdEvent       *fCmdEvent;         
 
  668    TRecExtraEvent     *fExtraEvent;       
 
  670    Bool_t              fCmdEventPending;  
 
  674    Int_t               fRegWinCounter;    
 
  677    Int_t               fFilteredIdsCount; 
 
  678    Window_t           *fFilteredIds;      
 
  680    Bool_t              fFilterEventPave;  
 
  683    friend class TRecorderInactive;
 
  684    TRecorderRecording(TRecorder *r, 
const char *filename, Option_t *option, Window_t *w, Int_t winCount);
 
  686    Bool_t StartRecording();
 
  689    virtual TRecorder::ERecorderState GetState()
 const { 
return TRecorder::kRecording; }
 
  691    virtual void Stop(TRecorder *r, Bool_t guiCommand);
 
  693    void  RegisterWindow(Window_t w);               
 
  694    void  RecordCmdEvent(
const char *line);         
 
  695    void  RecordGuiEvent(Event_t *e, Window_t wid); 
 
  696    void  RecordGuiBldEvent(Event_t *e);            
 
  697    void  RecordGuiCNEvent(Event_t *e);             
 
  698    void  RecordMousePosition();
 
  699    void  RecordPave(
const TObject *obj);           
 
  700    void  RecordText(
const TObject *obj);           
 
  701    void  FilterEventPave();                        
 
  704    void  RecordExtraEvent(TString line, TTime extTime);
 
  706    ClassDef(TRecorderRecording, 0) 
 
  719 class TRecorderInactive : 
public TRecorderState
 
  723    TSeqCollection *fCollect;
 
  726    virtual        ~TRecorderInactive() {}
 
  727    TRecorderInactive() : fCollect(0) {}
 
  729    virtual void   ListCmd(
const char *filename);
 
  730    virtual void   ListGui(
const char *filename);
 
  732    virtual void   Start(TRecorder *r, 
const char *filename, Option_t *option, Window_t *w = 0, Int_t winCount = 0);
 
  733    virtual Bool_t Replay(TRecorder *r, 
const char *filename, Bool_t showMouseCursor, TRecorder::EReplayModes mode);
 
  735    virtual TRecorder::ERecorderState GetState()
 const { 
return TRecorder::kInactive; }
 
  737    static void    DumpRootEvent(TRecGuiEvent *e, Int_t n);
 
  738    static long    DisplayValid(Long_t n) { 
return ( n < 0 ? -1 : n); }
 
  740    void PrevCanvases(
const char *filename, Option_t *option);
 
  742    ClassDef(TRecorderInactive, 0) 
 
  757 class TRecorderPaused: 
public TRecorderState
 
  760    virtual ~TRecorderPaused() {}
 
  762    TRecorderReplaying       *fReplayingState;      
 
  765    friend class TRecorderReplaying;
 
  766    TRecorderPaused(TRecorderReplaying *state);
 
  769    virtual TRecorder::ERecorderState GetState()
 const { 
return TRecorder::kPaused; }
 
  771    virtual void Resume(TRecorder *r);
 
  772    virtual void ReplayStop(TRecorder *r);
 
  774    ClassDef(TRecorderPaused, 0) 
 
  785 class TGRecorder : 
public TGMainFrame
 
  788    TRecorder          *fRecorder;          
 
  790    TGPictureButton    *fStartStop;         
 
  791    TGPictureButton    *fReplay;            
 
  794    TGLabel            *fTimeDisplay;       
 
  795    TGCheckButton      *fCursorCheckBox;    
 
  798    time_t              fStart, fElapsed;   
 
  800    static const Int_t  fgWidgetsCount = 12;            
 
  801    Window_t            fFilteredIds[fgWidgetsCount];   
 
  806    TGRecorder(
const TGWindow *p = 0, UInt_t w = 230, UInt_t h = 150);
 
  807    virtual ~TGRecorder();
 
  813    ClassDef(TGRecorder,0) 
 
  816 #endif // ROOT_TRecorder