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