// @(#)root/treeplayer:$Id$
// Author: Marek Biskup   24/01/2005

/*************************************************************************
 * Copyright (C) 1995-2005, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TTreeDrawArgsParser
#define ROOT_TTreeDrawArgsParser

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TTreeDrawArgsParser                                                  //
//                                                                      //
// A class that parses all parameters for TTree::Draw().                //
// See TTree::Draw() for the format description.                        //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TObject
#include "TObject.h"
#endif

#ifndef ROOT_TString
#include "TString.h"
#endif


class TTreeDrawArgsParser : public TObject {

public:
   enum EOutputType {
      kUNKNOWN,
      kEVENTLIST,
      kENTRYLIST,
      kPROFILE,
      kPROFILE2D,
      kGRAPH,
      kPOLYMARKER3D,
      kHISTOGRAM1D,
      kHISTOGRAM2D,
      kLISTOFGRAPHS,
      kLISTOFPOLYMARKERS3D,
      kHISTOGRAM3D
   };

   static Int_t   fgMaxDimension;      // = 4
   static Int_t   fgMaxParameters;     // = 9

protected:
   TString        fExp;        // complete variable expression
   TString        fSelection;  // selection expression
   TString        fOption;     // draw options

   Int_t          fDimension;  // dimension of the histogram/plot
   TString        fVarExp[4];  // variable expression 0 - X, 1 - Y, 2 - Z, 3 - W
                              // if dimension < fgMaxDimension then some
                              // expressions are empty

   Bool_t         fAdd;        // values should be added to an existing object
   TString        fName;       // histogram's/plot's name

   Int_t          fNoParameters;      // if dimensions of the plot was specified
   Bool_t         fParameterGiven[9]; // true if the parameter was given, otherwise false
   Double_t       fParameters[9];     // parameters in brackets

   Bool_t         fShouldDraw;        // if to draw the plot
   Bool_t         fOptionSame;        // if option contained "same"
   Bool_t         fEntryList;         // if fill a TEntryList
   TObject       *fOriginal;          // original plot (if it is to be reused)
   Bool_t         fDrawProfile;       // true if the options contain :"prof"
   EOutputType    fOutputType;        // type of the output

   void           ClearPrevious();
   TTreeDrawArgsParser::EOutputType DefineType();
   Bool_t         SplitVariables(TString variables);
   Bool_t         ParseName(TString name);
   Bool_t         ParseOption();
   Bool_t         ParseVarExp();

public:
   TTreeDrawArgsParser();
   ~TTreeDrawArgsParser();

   Bool_t         Parse(const char *varexp, const char *selection, Option_t *option);
   Bool_t         GetAdd() const { return fAdd; }
   Int_t          GetDimension() const { return fDimension; }
   Bool_t         GetShouldDraw() const { return fShouldDraw; }
   TString        GetExp() const { return fExp; }
   Double_t       GetIfSpecified(Int_t num, Double_t def) const;
   Int_t          GetNoParameters() const { return fNoParameters; }
   Double_t       GetParameter(int num) const;
   TString        GetProofSelectorName() const;
   TString        GetObjectName() const { return fName; }
   TString        GetObjectTitle() const;
   Bool_t         GetOptionSame() const { return fOptionSame; }
   TObject       *GetOriginal() const { return fOriginal; }
   TString        GetSelection() const { return fSelection; }
   TString        GetVarExp(Int_t num) const;
   TString        GetVarExp() const;
   Bool_t         IsSpecified(int num) const;
   void           SetObjectName(const char *s) { fName = s; }
   void           SetOriginal(TObject *o) { fOriginal = o; }
   static Int_t   GetMaxDimension();

   ClassDef(TTreeDrawArgsParser,0); // Helper class to parse the argument to TTree::Draw
};

#endif

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