#ifndef MARS_MTaskList
#define MARS_MTaskList

///////////////////////////////////////////////////////////////////////
//                                                                   //
// MTaskList                                                         //
//                                                                   //
// Collection of tasks to be processed in the eventloop              //
//                                                                   //
///////////////////////////////////////////////////////////////////////

#ifndef MARS_MTask
#include "MTask.h"
#endif

class MLog;
class MParList;
class MInputStreamID;

class MTaskList : public MTask
{
private:
    TList    *fTasks;	    // Container for the ordered list of different tasks
    TList    fTasksProcess; //!
    MParList *fParList;     //!

    UInt_t *fCntContinue;   //!
    UInt_t *fCntTrue;       //!

    enum { kIsOwner = BIT(14) };

    void   Remove(MTask *task);
    Bool_t CheckClassForProcess(TClass *cls);

public:
    MTaskList(const char *name=NULL, const char *title=NULL);
    MTaskList(MTaskList &ts);

    ~MTaskList();

    void SetLogStream(MLog *log);

    Bool_t AddToList(MTask *task, const char *tType="All", MTask *where = NULL);

    TObject *FindObject(const char *name) const;
    TObject *FindObject(const TObject *obj) const;

    Bool_t ReInit(MParList *pList=NULL);

    Bool_t PreProcess(MParList *pList);
    Bool_t Process();
    Bool_t PostProcess();

    void Print(Option_t *opt = "") const;
    void PrintStatistics(const Int_t lvl=0) const;
    void SetOwner(Bool_t enable=kTRUE);

    void SavePrimitive(ofstream &out, Option_t *o="");

    const TList *GetList() const { return fTasks; }

    ClassDef(MTaskList, 1) //collection of tasks to be performed in the eventloop
};

#endif
