//this file looks like plain C, but it's actually -*- c++ -*-
#ifndef __TQSampleVisitor__
#define __TQSampleVisitor__

#include "TNamed.h"
#include "TQStringUtils.h"

class TQSample;
class TQSampleFolder;
class TQTaggable;

class TQSampleVisitor : public TNamed {

protected:

  int fSampleColWidth;
  bool fVerbose;
  bool fPrettyPrint;
  bool fUpdateLines;

  TString fVisitTraceID;
  TString fStatusLine; //store the last printed status line to allow updates from child classes (e.g. indicating event loop progress)

  static TString statusSKIPPED(bool pretty);
  static TString statusOK(bool pretty);
  static TString statusFAILED(bool pretty);
  static TString statusWARN(bool pretty);
  static TString statusSKIPPEDOK(bool pretty);
  static TString statusRUNNING(bool pretty);
  static TString statusPROGRESS(bool pretty,double fraction);


  virtual int visitFolder(TQSampleFolder * sampleFolder, TString& message);
  virtual int visitSample(TQSample * sample, TString& message);
  virtual int revisitSample(TQSample * sample, TString& message);
  virtual int revisitFolder(TQSampleFolder * sampleFolder, TString& message);


  TString printLine(TQSampleFolder* f, int level, bool isSample, const TString& bullet);
  void updateLine(const TString& line, const TString& message, int result, bool ignore=false, double progress = 0.);
  inline void leaveTrace(TQSampleFolder* sf, TString prefix, int result, const TString& message);
  int getStatusID(TQSampleFolder* sampleFolder, TString prefix);
  bool callInitialize(TQSampleFolder * sampleFolder);
  int callVisit(TQSampleFolder * sampleFolder, int level, bool requireSelectionTag = false);
  bool callFinalize();

public:

  enum visitSTATUS {
    visitIGNORE = 9,
    visitLISTONLY = 8,
    visitPROGRESS = 7,
    visitSKIPPEDOK = 6,

    visitSKIPPED = 0,
    visitOK = 1,
    visitWARN = 2,
    visitFAILED = 3
  };

  static TString getStatusString(int status, bool prettyPrint, double progress=0.);

  TQSampleVisitor(const TString& name = "vis");

  void setVerbose(bool verbose = true);
  void setPrettyPrint(bool pretty = true);
  void setLineUpdates(bool allow = true);

  /* called before the first element is visited */
  virtual int initialize(TQSampleFolder * sampleFolder, TString& message);
  /* called after last element was visited */
  virtual int finalize();

  int visit(TQSampleFolder * sampleFolder, bool requireSelectionTag = false);

  bool setVisitTraceID(TString id);
  TString getVisitTraceID() const ;
  const char* getVisitTraceIDConst() const;

  void stamp(TQTaggable* obj) const;
  void unstamp(TQTaggable* obj) const;
  bool checkVisit(TQTaggable* obj) const;
  bool checkVisitFriends(TQSampleFolder* obj) const;
  static bool checkRestrictionTag(TQSampleFolder* sf);

  static void updateFriends(TQSampleFolder* sf);

  virtual ~TQSampleVisitor();

  ClassDefOverride(TQSampleVisitor, 0); //QFramework class

};

#endif
 TQSampleVisitor.h:1
 TQSampleVisitor.h:2
 TQSampleVisitor.h:3
 TQSampleVisitor.h:4
 TQSampleVisitor.h:5
 TQSampleVisitor.h:6
 TQSampleVisitor.h:7
 TQSampleVisitor.h:8
 TQSampleVisitor.h:9
 TQSampleVisitor.h:10
 TQSampleVisitor.h:11
 TQSampleVisitor.h:12
 TQSampleVisitor.h:13
 TQSampleVisitor.h:14
 TQSampleVisitor.h:15
 TQSampleVisitor.h:16
 TQSampleVisitor.h:17
 TQSampleVisitor.h:18
 TQSampleVisitor.h:19
 TQSampleVisitor.h:20
 TQSampleVisitor.h:21
 TQSampleVisitor.h:22
 TQSampleVisitor.h:23
 TQSampleVisitor.h:24
 TQSampleVisitor.h:25
 TQSampleVisitor.h:26
 TQSampleVisitor.h:27
 TQSampleVisitor.h:28
 TQSampleVisitor.h:29
 TQSampleVisitor.h:30
 TQSampleVisitor.h:31
 TQSampleVisitor.h:32
 TQSampleVisitor.h:33
 TQSampleVisitor.h:34
 TQSampleVisitor.h:35
 TQSampleVisitor.h:36
 TQSampleVisitor.h:37
 TQSampleVisitor.h:38
 TQSampleVisitor.h:39
 TQSampleVisitor.h:40
 TQSampleVisitor.h:41
 TQSampleVisitor.h:42
 TQSampleVisitor.h:43
 TQSampleVisitor.h:44
 TQSampleVisitor.h:45
 TQSampleVisitor.h:46
 TQSampleVisitor.h:47
 TQSampleVisitor.h:48
 TQSampleVisitor.h:49
 TQSampleVisitor.h:50
 TQSampleVisitor.h:51
 TQSampleVisitor.h:52
 TQSampleVisitor.h:53
 TQSampleVisitor.h:54
 TQSampleVisitor.h:55
 TQSampleVisitor.h:56
 TQSampleVisitor.h:57
 TQSampleVisitor.h:58
 TQSampleVisitor.h:59
 TQSampleVisitor.h:60
 TQSampleVisitor.h:61
 TQSampleVisitor.h:62
 TQSampleVisitor.h:63
 TQSampleVisitor.h:64
 TQSampleVisitor.h:65
 TQSampleVisitor.h:66
 TQSampleVisitor.h:67
 TQSampleVisitor.h:68
 TQSampleVisitor.h:69
 TQSampleVisitor.h:70
 TQSampleVisitor.h:71
 TQSampleVisitor.h:72
 TQSampleVisitor.h:73
 TQSampleVisitor.h:74
 TQSampleVisitor.h:75
 TQSampleVisitor.h:76
 TQSampleVisitor.h:77
 TQSampleVisitor.h:78
 TQSampleVisitor.h:79
 TQSampleVisitor.h:80
 TQSampleVisitor.h:81
 TQSampleVisitor.h:82
 TQSampleVisitor.h:83
 TQSampleVisitor.h:84
 TQSampleVisitor.h:85
 TQSampleVisitor.h:86
 TQSampleVisitor.h:87
 TQSampleVisitor.h:88
 TQSampleVisitor.h:89
 TQSampleVisitor.h:90
 TQSampleVisitor.h:91
 TQSampleVisitor.h:92
 TQSampleVisitor.h:93
 TQSampleVisitor.h:94