Index: trunk/MagicSoft/Mars/meventdisp/EvtDispLinkDef.h
===================================================================
--- trunk/MagicSoft/Mars/meventdisp/EvtDispLinkDef.h	(revision 957)
+++ trunk/MagicSoft/Mars/meventdisp/EvtDispLinkDef.h	(revision 959)
@@ -5,5 +5,8 @@
 #pragma link off all functions;
 
-#pragma link C++ class MGFadcDisp ;
+#pragma link C++ class MGEvtDisplay;
+
+#pragma link C++ class MGFadcDisp;
+#pragma link C++ class MGCamDisplay;
 
 #endif
Index: trunk/MagicSoft/Mars/meventdisp/MGCamDisplay.cc
===================================================================
--- trunk/MagicSoft/Mars/meventdisp/MGCamDisplay.cc	(revision 959)
+++ trunk/MagicSoft/Mars/meventdisp/MGCamDisplay.cc	(revision 959)
@@ -0,0 +1,258 @@
+/* ======================================================================== *\
+!
+! *
+! * This file is part of MARS, the MAGIC Analysis and Reconstruction
+! * Software. It is distributed to you in the hope that it can be a useful
+! * and timesaving tool in analysing Data of imaging Cerenkov telescopes.
+! * It is distributed WITHOUT ANY WARRANTY.
+! *
+! * Permission to use, copy, modify and distribute this software and its
+! * documentation for any purpose is hereby granted without fee,
+! * provided that the above copyright notice appear in all copies and
+! * that both that copyright notice and this permission notice appear
+! * in supporting documentation. It is provided "as is" without express
+! * or implied warranty.
+! *
+!
+!
+!   Author(s): Thomas Bretz  10/2001 (tbretz@uni-sw.gwdg.de)
+!
+!   Copyright: MAGIC Software Development, 2000-2001
+!
+!
+\* ======================================================================== */
+
+#include "MGCamDisplay.h"
+
+#include <TList.h>                // TList
+#include <TGButton.h>             // TGPictureButton
+#include <TGButtonGroup.h>
+
+#include "MClone.h"
+#include "MHillas.h"
+#include "MEvtLoop.h"
+#include "MParList.h"
+#include "MTaskList.h"
+#include "MReadTree.h"
+#include "MCamDisplay.h"
+#include "MHillasCalc.h"
+#include "MPedestalCam.h"
+#include "MCerPhotCalc.h"
+#include "MImgCleanStd.h"
+#include "MGeomCamMagic.h"
+
+ClassImp(MGCamDisplay);
+
+enum
+{
+    M_RBUT_RAW    = 0x1000,
+    M_RBUT_CLEAN  = 0x1001,
+    M_CBUT_HILLAS = 0x1002
+};
+
+// --------------------------------------------------------------------------
+//
+//  Add Setup elements to GUI.
+//
+void MGCamDisplay::AddSetupElements()
+{
+    //
+    // Create gui elements for vertical frame
+    //
+    TGVButtonGroup *group = new TGVButtonGroup(fTab1);
+    fList->Add(group);
+
+    TGRadioButton *but1 = new TGRadioButton(group, "Raw Events",      M_RBUT_RAW);
+    TGRadioButton *but2 = new TGRadioButton(group, "Cleaned Events",  M_RBUT_CLEAN);
+    TGCheckButton *but3 = new TGCheckButton(fTab1, "Display Ellipse", M_CBUT_HILLAS);
+
+    but2->SetState(kButtonDown);
+    but3->SetState(kButtonDown);
+
+    fDisplayRaw    = kFALSE;
+    fDisplayHillas = kTRUE;
+
+    /*
+     FIXME: crashed the destructor
+
+     fList->Add(but1);
+     fList->Add(but2);
+     */
+
+    but1->Associate(this);
+    but2->Associate(this);
+    but3->Associate(this);
+
+    TGLayoutHints *laybut = new TGLayoutHints(kLHintsNormal, 15, 0);
+    fList->Add(laybut);
+
+    fTab1->AddFrame(group);
+    fTab1->AddFrame(but3, laybut);
+}
+
+// --------------------------------------------------------------------------
+//
+//  Setup Task and parameter list for hillas calculation,
+//  preprocess tasks and read in first event (process)
+//
+MGeomCam *MGCamDisplay::SetupTaskList()
+{
+    MTaskList *tlist = GetTaskList();
+    MParList  *plist = GetParList();
+
+    MCerPhotCalc *ncalc = new MCerPhotCalc;
+    MClone       *clone = new MClone("MCerPhotEvt");
+    MImgCleanStd *clean = new MImgCleanStd;
+    MHillasCalc  *hcalc = new MHillasCalc;
+
+    tlist->AddToList(ncalc);
+    tlist->AddToList(clone);
+    tlist->AddToList(clean);
+    tlist->AddToList(hcalc);
+
+    MGeomCamMagic *geom   = new MGeomCamMagic;
+    MPedestalCam  *pedest = new MPedestalCam;
+
+    plist->AddToList(geom);
+    plist->AddToList(pedest);
+
+    fEvtLoop->PreProcess();
+    GetTaskList()->Process();
+
+    return geom;
+}
+
+// --------------------------------------------------------------------------
+//
+//  Constructor.
+//
+MGCamDisplay::MGCamDisplay(const char *filename,
+                           const TGWindow *p, const TGWindow *main,
+                           UInt_t w, UInt_t h)
+: MGEvtDisplay(filename, "Events", p, main, w, h), fDisplay(NULL)
+{
+    //
+    // Setup Task list for hillas calculation
+    //
+    MGeomCam *geom = SetupTaskList();
+
+    //
+    // Add missing setup elements to GUI
+    //
+    AddSetupElements();
+
+    //
+    // Show camera display for the actual geometry
+    //
+    fDisplay = new MCamDisplay(geom);
+    fDisplay->Draw();
+
+    fList->Add(fDisplay);
+
+    //
+    //   Map the window, set up the layout, etc.
+    //
+    SetWMSizeHints(450, 400, 1000, 1000, 10, 10 );      // set the smallest and biggest size of the Main frame
+
+    MapSubwindows();
+
+    Layout();
+
+    SetWindowName("Hillas Event Display");
+    SetIconName("Hillas");
+
+    UpdateDisplay();
+    UpdateNumOfEvts();
+    UpdateEventCounter();
+
+    MapWindow();
+}
+
+// --------------------------------------------------------------------------
+//
+//  Update event display:
+//  dependent on the setup either the uncleaned or cleand data is shown
+//  together with the hillas ellipse or not.
+//
+void MGCamDisplay::UpdateDisplay()
+{
+    if (!fDisplay)
+        return;
+
+    const MParList *plist = fEvtLoop->GetParList();
+
+    //
+    // Show Hillas ellipse
+    //
+    MHillas *hillas = (MHillas*)plist->FindObject("MHillas");
+
+    hillas->Print();
+    if (fDisplayHillas)
+        hillas->Draw();
+    else
+        hillas->Clear();
+
+    //
+    // Display the requested event. This does a Canvas update, too.
+    //
+    MCerPhotEvt *evt = NULL;
+    if (fDisplayRaw)
+    {
+        //
+        // Get a clone of MCerPhotEvt which is made before the image cleaning
+        //
+        const MClone *clone = (MClone*)GetTaskList()->FindObject("MClone");
+        evt = (MCerPhotEvt*)clone->GetClone();
+    }
+    else
+    {
+        //
+        // Get MCerPhotEvt which containes the cleaned data
+        //
+        evt = (MCerPhotEvt*)plist->FindObject("MCerPhotEvt");
+    }
+
+    fDisplay->DrawPhotNum(evt);
+}
+
+// --------------------------------------------------------------------------
+//
+//  Process the messages from the setup GUI elements.
+//
+Bool_t MGCamDisplay::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
+{
+    switch(GET_MSG(msg))
+    {
+    case kC_COMMAND:
+        switch(GET_SUBMSG(msg))
+        {
+        case kCM_CHECKBUTTON:
+            switch (parm1)
+            {
+            case M_CBUT_HILLAS:
+                fDisplayHillas = !fDisplayHillas;
+                UpdateDisplay();
+                return kTRUE;
+            }
+            break;
+
+        case kCM_RADIOBUTTON:
+            switch (parm1)
+            {
+            case M_RBUT_RAW:
+                fDisplayRaw = kTRUE;
+                UpdateDisplay();
+                return kTRUE;
+
+            case M_RBUT_CLEAN:
+                fDisplayRaw = kFALSE;
+                UpdateDisplay();
+                return kTRUE;
+            }
+            break;
+        }
+        break;
+    }
+    return MGEvtDisplay::ProcessMessage(msg, parm1, parm2);
+}
+
Index: trunk/MagicSoft/Mars/meventdisp/MGCamDisplay.h
===================================================================
--- trunk/MagicSoft/Mars/meventdisp/MGCamDisplay.h	(revision 959)
+++ trunk/MagicSoft/Mars/meventdisp/MGCamDisplay.h	(revision 959)
@@ -0,0 +1,43 @@
+#ifndef MGCAMDISPLAY_H
+#define MGCAMDISPLAY_H
+
+#ifndef MAGIC_H
+#include "MAGIC.h"
+#endif
+
+#ifndef MGEVTDISPLAY_H
+#include "MGEvtDisplay.h"
+#endif
+
+class TGListBox;
+
+class MGeomCam;
+class MCamDisplay;
+
+class MGCamDisplay : public MGEvtDisplay
+{
+private:
+    Bool_t fDisplayRaw;
+    Bool_t fDisplayHillas;
+
+    TGListBox   *fPixelList;
+    MCamDisplay *fDisplay;
+
+    void AddSetupElements();
+    void UpdateDisplay();
+
+    MGeomCam *SetupTaskList();
+
+public:
+    MGCamDisplay(const char *filename,
+                 const TGWindow *p, const TGWindow *main,
+                 UInt_t w, UInt_t h);
+
+    Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2);
+
+    ClassDef(MGCamDisplay, 0)
+};
+
+#endif
+
+
Index: trunk/MagicSoft/Mars/meventdisp/MGEvtDisplay.cc
===================================================================
--- trunk/MagicSoft/Mars/meventdisp/MGEvtDisplay.cc	(revision 959)
+++ trunk/MagicSoft/Mars/meventdisp/MGEvtDisplay.cc	(revision 959)
@@ -0,0 +1,488 @@
+/* ======================================================================== *\
+!
+! *
+! * This file is part of MARS, the MAGIC Analysis and Reconstruction
+! * Software. It is distributed to you in the hope that it can be a useful
+! * and timesaving tool in analysing Data of imaging Cerenkov telescopes.
+! * It is distributed WITHOUT ANY WARRANTY.
+! *
+! * Permission to use, copy, modify and distribute this software and its
+! * documentation for any purpose is hereby granted without fee,
+! * provided that the above copyright notice appear in all copies and
+! * that both that copyright notice and this permission notice appear
+! * in supporting documentation. It is provided "as is" without express
+! * or implied warranty.
+! *
+!
+!
+!   Author(s): Thomas Bretz  10/2001 (tbretz@uni-sw.gwdg.de)
+!
+!   Copyright: MAGIC Software Development, 2000-2001
+!
+!
+\* ======================================================================== */
+
+#include "MGEvtDisplay.h"
+
+#include <stdlib.h>               // atoi
+
+#include <TGTab.h>                // TGTab
+#include <TGLabel.h>              // TGLabel
+#include <TGButton.h>             // TGPictureButton
+#include <TGMsgBox.h>             // TGMsgBox
+#include <TGTextEntry.h>          // TGTextEntry
+#include <TRootEmbeddedCanvas.h>  // TRootEmbeddedCanvas
+
+#include <TG3DLine.h>             // TGHorizontal3DLine
+                                  // use TGSplitter instead for root<3.00
+
+#include "MParList.h"
+#include "MTaskList.h"
+#include "MEvtLoop.h"
+#include "MReadTree.h"
+
+ClassImp(MGEvtDisplay);
+
+enum MGCamDisplayCommand
+{
+    M_PREVEVT,
+    M_NEXTEVT,
+    M_EVTNUMBER,
+
+    M_PRINT,
+    M_CLOSE
+}; 
+
+// --------------------------------------------------------------------------
+//
+//  Return a pointer to the parameter list.
+//
+MParList *MGEvtDisplay::GetParList() const
+{
+    return fEvtLoop->GetParList();
+}
+
+// --------------------------------------------------------------------------
+//
+//  Return a pointer to the task list.
+//
+MTaskList *MGEvtDisplay::GetTaskList() const
+{
+    return (MTaskList*)GetParList()->FindObject("MTaskList");
+}
+
+// --------------------------------------------------------------------------
+//
+//  Return a pointer to the reader task (MReadTree)
+//
+MReadTree *MGEvtDisplay::GetReader() const
+{
+    return (MReadTree*)GetTaskList()->FindObject("MReadTree");
+}
+
+// --------------------------------------------------------------------------
+//
+//  Add the top part of the frame: This is filename and treename display
+//
+void MGEvtDisplay::AddTopFramePart1(TGVerticalFrame *frame,
+                                    const char *filename,
+                                    const char *treename)
+{
+    //
+    //  --- the top1 part of the window ---
+    //
+    TGHorizontalFrame *top1 = new TGHorizontalFrame(frame, 300, 100);
+    fList->Add(top1);
+
+    //
+    // create gui elements
+    //
+    TGLabel *lfile = new TGLabel(top1, new TGString("File:"));
+    TGLabel *file  = new TGLabel(top1, new TGString(filename));
+    TGLabel *ltree = new TGLabel(top1, new TGString("Tree:"));
+    TGLabel *tree  = new TGLabel(top1, new TGString(treename));
+
+    fList->Add(lfile);
+    fList->Add(file);
+    fList->Add(ltree);
+    fList->Add(tree);
+
+    //
+    // layout and add gui elements in/to frame
+    //
+    TGLayoutHints *laystd = new TGLayoutHints(kLHintsLeft, 10, 10, 10, 10);
+    fList->Add(laystd);
+
+    top1->AddFrame(lfile, laystd);
+    top1->AddFrame(file,  laystd);
+    top1->AddFrame(ltree, laystd);
+    top1->AddFrame(tree,  laystd);
+
+    //
+    // layout and add frame
+    //
+    TGLayoutHints *laytop1 = new TGLayoutHints(kLHintsTop);
+    fList->Add(laytop1);
+
+    frame->AddFrame(top1, laytop1);
+}
+
+// --------------------------------------------------------------------------
+//
+//  Show the correct number of events
+//
+void MGEvtDisplay::UpdateNumOfEvts()
+{
+    char txt[100];
+    sprintf(txt, "out of %d Events", GetReader()->GetEntries());
+
+    fNumOfEvts->SetText(new TGString(txt));
+}
+
+// --------------------------------------------------------------------------
+//
+//  Add the second part of the top frame: This are the event number controls
+//
+void MGEvtDisplay::AddTopFramePart2(TGVerticalFrame *frame)
+{
+    //
+    // --- the top2 part of the window ---
+    //
+    TGHorizontalFrame *top2 = new TGHorizontalFrame(frame, 300, 100);
+    fList->Add(top2);
+
+    //
+    // Create the gui elements
+    //
+    TGTextButton *prevevt = new TGTextButton(top2, "<< Previous Event", M_PREVEVT);
+    prevevt->Associate(this);
+
+    TGLabel *evtnr = new TGLabel(top2, new TGString("Event: "));
+
+    fTxtEvtNr = new TGTextEntry(top2, new TGTextBuffer(100), M_EVTNUMBER);
+    fTxtEvtNr->Resize(60, fTxtEvtNr->GetDefaultHeight());
+    fTxtEvtNr->Associate(this);
+
+    fNumOfEvts = new TGLabel(top2, "out of           Events.");
+
+    TGTextButton *nextevt = new TGTextButton (top2, "Next Event >>", M_NEXTEVT);
+    nextevt->Associate(this);
+
+    //
+    // Add gui elements to 'atotodel'
+    //
+    fList->Add(prevevt);
+    fList->Add(evtnr);
+    fList->Add(fTxtEvtNr);
+    fList->Add(fNumOfEvts);
+    fList->Add(nextevt);
+
+    //
+    // add the gui elements to the frame
+    //
+    TGLayoutHints *laystd    = new TGLayoutHints(kLHintsLeft|kLHintsCenterY, 10, 10, 10, 10);
+
+    fList->Add(laystd);
+
+    top2->AddFrame(prevevt,    laystd);
+    top2->AddFrame(evtnr,      laystd);
+    top2->AddFrame(fTxtEvtNr,  laystd);
+    top2->AddFrame(fNumOfEvts, laystd);
+    top2->AddFrame(nextevt,    laystd);
+
+    frame->AddFrame(top2, new TGLayoutHints(kLHintsCenterX));
+}
+
+// --------------------------------------------------------------------------
+//
+//  Add the mid frame: This are the two tabs with the canvas in the right one
+//
+void MGEvtDisplay::AddMidFrame(TGHorizontalFrame *frame)
+{
+    //
+    // create tab control
+    //
+    TGTab *tabs = new TGTab(frame, 300, 300);
+
+    //
+    // Create Tab1
+    //
+    fTab1 = tabs->AddTab("Setup");
+
+    //
+    // Crete second gui elemet for tab1 (TGVertical Frame)
+    //
+    TGLayoutHints *laytabs = new TGLayoutHints(kLHintsNormal|kLHintsExpandY, 10, 10, 10, 10);
+    frame->AddFrame(tabs, laytabs);
+
+    //
+    // Create second part of frame
+    // 
+    TGTab *tabdisp = new TGTab(frame, 300, 300);
+
+    TGCompositeFrame *tab2 = tabdisp->AddTab("Event Display");
+
+    TRootEmbeddedCanvas *canvas = new TRootEmbeddedCanvas("EventDisplay", tab2, 400, 400);
+
+    TGLayoutHints *laycanvas = new TGLayoutHints(kLHintsCenterX|kLHintsCenterY|kLHintsExpandX|kLHintsExpandY);
+    tab2->AddFrame(canvas, laycanvas);
+
+    fCanvas = canvas->GetCanvas();
+
+    //
+    // Add second part to frame
+    //
+    TGLayoutHints *laydisp = new TGLayoutHints(kLHintsNormal|kLHintsExpandY|kLHintsExpandX, 10, 10, 10, 10);
+    frame->AddFrame(tabdisp, laydisp);
+
+    //
+    // Now add all gui elements to 'autodel'-list
+    //
+    fList->Add(tabdisp);
+    fList->Add(canvas);
+    fList->Add(laycanvas);
+    fList->Add(laydisp);
+    fList->Add(laytabs);
+}
+
+// --------------------------------------------------------------------------
+//
+//  Add the low frame: These are the buttons Print and Close
+//
+void MGEvtDisplay::AddLowFrame(TGHorizontalFrame *frame)
+{
+    TGTextButton *but1 = new TGTextButton(frame, "Print", M_PRINT);
+    TGTextButton *but2 = new TGTextButton(frame, "Close", M_CLOSE);
+
+    but1->Associate(this);
+    but2->Associate(this);
+
+    fList->Add(but1);
+    fList->Add(but2);
+
+    TGLayoutHints *laybut = new TGLayoutHints(kLHintsLeft, 10, 10, 10, 10);
+    fList->Add(laybut);
+
+    frame->AddFrame(but1, laybut);
+    frame->AddFrame(but2, laybut);
+}
+
+// --------------------------------------------------------------------------
+//
+//  Create and setup all the three frames and build the window interieur
+//
+void MGEvtDisplay::AddFrames(const char *filename, const char *treename)
+{
+    //
+    // Create the frame elements and add gui elements to it
+    //
+    TGVerticalFrame *frametop = new TGVerticalFrame(this, 300, 100);
+    fList->Add(frametop);
+
+    AddTopFramePart1(frametop, filename, treename);
+    AddTopFramePart2(frametop);
+
+    TGLayoutHints *laytop  = new TGLayoutHints(kLHintsTop|kLHintsCenterX);
+    fList->Add(laytop);
+
+    // -----
+
+    TGHorizontalFrame *framemid = new TGHorizontalFrame(this, 300, 100);
+    fList->Add(framemid);
+
+    AddMidFrame(framemid);
+
+    TGLayoutHints *laymid  = new TGLayoutHints(kLHintsExpandY|kLHintsExpandX);
+    fList->Add(laymid);
+
+    //
+    // add frame elements to 'autodel'
+    //
+    TGHorizontal3DLine *line1 = new TGHorizontal3DLine(this);
+    TGHorizontal3DLine *line2   = new TGHorizontal3DLine(this);
+    fList->Add(line1);
+    fList->Add(line2);
+
+    TGLayoutHints *layline = new TGLayoutHints(kLHintsTop|kLHintsExpandX);
+    fList->Add(layline);
+
+    // -----
+    TGHorizontalFrame *framelow = new TGHorizontalFrame(this, 300, 100);
+    fList->Add(framelow);
+
+    AddLowFrame(framelow);
+
+    TGLayoutHints *laylow  = new TGLayoutHints(kLHintsTop);
+    fList->Add(laylow);
+
+    //
+    // Layout frame elements and add elements to frame
+    //
+    AddFrame(frametop, laytop);
+    AddFrame(line1,    layline);
+    AddFrame(framemid, laymid);
+    AddFrame(line2,    layline);
+    AddFrame(framelow, laylow);
+}
+
+// --------------------------------------------------------------------------
+//
+//  Constructor
+//
+MGEvtDisplay::MGEvtDisplay(const char *fname, const char *tname,
+                           const TGWindow *p, const TGWindow *main,
+                           UInt_t w, UInt_t h)
+    : TGTransientFrame(p, main, w, h)
+{
+    //
+    //  create an autodelete-list for the gui elements
+    //
+    fList = new TList;
+    fList->SetOwner();
+
+    //
+    // Setup an empty job, with a reader task only.
+    // All tasks and parameter containers are deleted automatically
+    // (via SetOwner())
+    //
+
+    MTaskList *tlist = new MTaskList;
+    tlist->SetOwner();
+
+    MReadTree *read = new MReadTree(tname, fname);
+    tlist->AddToList(read);
+
+    MParList *plist = new MParList();
+    plist->SetOwner();
+    plist->AddToList(tlist);
+
+    fEvtLoop = new MEvtLoop;
+    fEvtLoop->SetOwner();
+    fEvtLoop->SetParList(plist);
+
+    //
+    // Add all GUI elements and update the event counter
+    // 
+    AddFrames(fname, tname);
+    UpdateEventCounter();
+}
+
+
+// --------------------------------------------------------------------------
+//
+//  Destructs the graphical members and the eventloop members
+//
+MGEvtDisplay::~MGEvtDisplay()
+{
+    delete fList;
+
+    fEvtLoop->PostProcess();
+    delete fEvtLoop;
+}
+
+// --------------------------------------------------------------------------
+//
+// The close message is generated by the window manager when its close
+// window menu item is selected.
+//
+void MGEvtDisplay::CloseWindow()
+{
+    delete this;
+}
+
+// --------------------------------------------------------------------------
+//
+//  Checks if the event number is valid, and if so reads the new event
+//  and updates the display
+//
+void MGEvtDisplay::ReadinEvent(UInt_t iEvt)
+{
+    Int_t buttons = 4;
+    Int_t retval  = 0;
+
+    //  first check if the new event is in the range of possible events
+  
+    if (iEvt >= GetReader()->GetEntries())
+    {
+        new TGMsgBox(gClient->GetRoot(), this,
+                     "WARNING!",
+                     "The event number is out of range!!!",
+                     kMBIconExclamation, buttons, &retval);
+    }
+    else
+    {
+        GetReader()->SetEventNum(iEvt);
+
+        if (GetTaskList()->Process())
+            UpdateDisplay();
+    }
+
+    UpdateEventCounter();
+}
+
+// --------------------------------------------------------------------------
+//
+//  Update the event counter
+//
+void MGEvtDisplay::UpdateEventCounter()
+{
+    char txt[256];
+
+    sprintf(txt, "%d", GetReader()->GetEventNum());
+
+    fTxtEvtNr->SetText(txt);
+}
+
+// --------------------------------------------------------------------------
+//
+//    ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
+//
+// Processes information from all GUI items.
+// Selecting an item usually generates an event with 4 parameters.
+// The first two are packed into msg (first and second bytes).
+// The other two are parm1 and parm2.
+//
+Bool_t MGEvtDisplay::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
+{
+    switch(GET_MSG(msg))
+    {
+    case kC_COMMAND:
+        switch(GET_SUBMSG(msg))
+        {
+        case kCM_BUTTON:
+            switch (parm1)
+            {
+            case M_PREVEVT:
+                //
+                // '-2' is because MReadTree::Process increases the
+                // Event number by one - this is the natural behaviour
+                // after reading one event
+                //
+                ReadinEvent(GetReader()->GetEventNum()-2);
+                return kTRUE;
+
+            case M_NEXTEVT:
+                //
+                // '+0' is because MReadTree::Process increases the
+                // Event number by one - this is the natural behaviour
+                // after reading one event
+                //
+                ReadinEvent(GetReader()->GetEventNum());
+                return kTRUE;
+
+            case M_CLOSE:
+                CloseWindow();
+                return kTRUE;
+            }
+            return kTRUE;
+        }
+        return kTRUE;
+
+    case kC_TEXTENTRY:
+        if (GET_SUBMSG(msg) == kTE_ENTER)
+            ReadinEvent(atoi(fTxtEvtNr->GetText()));
+        return kTRUE;
+    }
+
+    return kTRUE;
+}
Index: trunk/MagicSoft/Mars/meventdisp/MGEvtDisplay.h
===================================================================
--- trunk/MagicSoft/Mars/meventdisp/MGEvtDisplay.h	(revision 959)
+++ trunk/MagicSoft/Mars/meventdisp/MGEvtDisplay.h	(revision 959)
@@ -0,0 +1,78 @@
+#ifndef MGEVTDISPLAY_H
+#define MGEVTDISPLAY_H
+
+#ifndef MAGIC_H
+#include "MAGIC.h"
+#endif
+
+#ifndef ROOT_TGFrame
+#include <TGFrame.h>
+#endif
+
+class TList;
+class TCanvas;
+class TGLabel;
+class TGTextEntry;
+
+class MEvtLoop;
+class MParList;
+class MTaskList;
+class MReadTree;
+
+class MGEvtDisplay : public TGTransientFrame
+{
+private:
+    //
+    // GUI stuff
+    //
+    TGLabel     *fNumOfEvts;
+    TGTextEntry *fTxtEvtNr;
+
+    void AddTopFramePart1(TGVerticalFrame *frame,
+                          const char *filename,
+                          const char *treename);
+    void AddTopFramePart2(TGVerticalFrame *frame);
+    void AddMidFrame(TGHorizontalFrame *frame);
+    void AddLowFrame(TGHorizontalFrame *frame);
+
+    void AddFrames(const char *filename, const char *treename);
+
+    void ReadinEvent(UInt_t iEvt);
+
+protected:
+    TList     *fList;
+    MEvtLoop  *fEvtLoop;
+
+    TCanvas   *fCanvas;
+
+    TGCompositeFrame *fTab1;
+    TGCompositeFrame *fTab2;
+
+    TGVerticalFrame  *fMidFrame;
+
+    MParList  *GetParList() const;
+    MTaskList *GetTaskList() const;
+    MReadTree *GetReader() const;
+
+    void UpdateEventCounter();
+    void UpdateNumOfEvts();
+
+    virtual void UpdateDisplay() = 0;
+
+public:
+    MGEvtDisplay(const char *fname, const char *tname,
+                 const TGWindow *p, const TGWindow *main,
+                 UInt_t w, UInt_t h);
+
+    ~MGEvtDisplay();
+
+    void CloseWindow();
+
+    virtual Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2);
+
+    ClassDef(MGEvtDisplay, 0)
+};
+
+#endif
+
+
Index: trunk/MagicSoft/Mars/meventdisp/MGFadcDisp.cc
===================================================================
--- trunk/MagicSoft/Mars/meventdisp/MGFadcDisp.cc	(revision 957)
+++ trunk/MagicSoft/Mars/meventdisp/MGFadcDisp.cc	(revision 959)
@@ -1,3 +1,3 @@
-/* ======================================================================== *\
+/*======================================================================== *\
 !
 ! *
@@ -16,6 +16,5 @@
 !
 !
-!   Author(s): Harald Kornmayer 1/2001 (harald@mppmu.mpg.de)
-!   Author(s): Thomas Bretz  12/2000 (tbretz@uni-sw.gwdg.de)
+!   Author(s): Thomas Bretz  10/2001 (tbretz@uni-sw.gwdg.de)
 !
 !   Copyright: MAGIC Software Development, 2000-2001
@@ -44,5 +43,7 @@
                                   // use TGSplitter instead for root<3.00
 #include "MParList.h"
+#include "MTaskList.h"
 #include "MReadTree.h"
+#include "MEvtLoop.h"
 #include "MRawEvtData.h"
 #include "MRawEvtPixelIter.h"
@@ -52,150 +53,43 @@
 enum MGFadcDispCommand
 {
-    M_PIXELLIST = 4201,
-    M_PREVEVT,
-    M_NEXTEVT,
-    M_EVTNUMBER,
-
-    M_PREVPIXEL,
-    M_NEXTPIXEL,
-
-    M_PRINT,
-    M_CLOSE
-}; 
-
-void MGFadcDisp::AddTopFramePart1(TGVerticalFrame *frame,
-                                  const char *filename,
-                                  const char *treename)
-{
-    //
-    //  --- the top1 part of the window ---
-    //
-    TGHorizontalFrame *top1 = new TGHorizontalFrame(frame, 300, 100);
-    fList->Add(top1);
-
-    //
-    // create gui elements
-    //
-    TGLabel *lfile = new TGLabel(top1, new TGString("File:"));
-    TGLabel *file  = new TGLabel(top1, new TGString(filename));
-    TGLabel *ltree = new TGLabel(top1, new TGString("Tree:"));
-    TGLabel *tree  = new TGLabel(top1, new TGString(treename));
-
-    fList->Add(lfile);
-    fList->Add(file);
-    fList->Add(ltree);
-    fList->Add(tree);
-
-    //
-    // layout and add gui elements in/to frame
-    //
-    TGLayoutHints *laystd = new TGLayoutHints(kLHintsLeft, 10, 10, 10, 10);
-    fList->Add(laystd);
-
-    top1->AddFrame(lfile, laystd);
-    top1->AddFrame(file,  laystd);
-    top1->AddFrame(ltree, laystd);
-    top1->AddFrame(tree,  laystd);
-
-    //
-    // layout and add frame
-    //
-    TGLayoutHints *laytop1 = new TGLayoutHints(kLHintsTop);
-    fList->Add(laytop1);
-
-    frame->AddFrame(top1, laytop1);
-}
-
-void MGFadcDisp::AddTopFramePart2(TGVerticalFrame *frame)
-{
-    //
-    // --- the top2 part of the window ---
-    //
-    TGHorizontalFrame *top2 = new TGHorizontalFrame(frame, 300, 100);
-    fList->Add(top2);
-
-    //
-    // Create the gui elements
-    //
-    TGTextButton *prevevt = new TGTextButton(top2, "<< Previous Event", M_PREVEVT);
-    prevevt->Associate(this);
-
-    TGLabel *evtnr = new TGLabel(top2, new TGString("Event: "));
-
-    fTxtEvtNr = new TGTextEntry(top2, new TGTextBuffer(100), M_EVTNUMBER);
-    fTxtEvtNr->Resize(60, fTxtEvtNr->GetDefaultHeight());
-    fTxtEvtNr->Associate(this);
-
-    char wortdummy[100];
-    sprintf(wortdummy, "out of %d Events", fReadTree->GetEntries());
-    TGLabel *totnr = new TGLabel(top2, new TGString(wortdummy));
-
-    TGTextButton *nextevt = new TGTextButton (top2, "Next Event >>", M_NEXTEVT);
-    nextevt->Associate(this);
-
-    //
-    // Add gui elements to 'atotodel'
-    //
-    fList->Add(prevevt);
-    fList->Add(evtnr);
-    fList->Add(fTxtEvtNr);
-    fList->Add(totnr);
-    fList->Add(nextevt);
-
-    //
-    // add the gui elements to the frame
-    //
-    TGLayoutHints *laystd    = new TGLayoutHints(kLHintsLeft, 10, 10, 10, 10);
-    TGLayoutHints *laytentry = new TGLayoutHints(kLHintsNormal, 5, 5, 5, 5);
-
-    fList->Add(laystd);
-    fList->Add(laytentry);
-
-    top2->AddFrame(prevevt,   laystd);
-    top2->AddFrame(evtnr,     laystd);
-    top2->AddFrame(fTxtEvtNr, laytentry);
-    top2->AddFrame(totnr,     laystd);
-    top2->AddFrame(nextevt,   laystd);
-
-    frame->AddFrame(top2, new TGLayoutHints(kLHintsCenterX));
-}
-
-void MGFadcDisp::AddMidFrame(TGHorizontalFrame *frame)
-{
-    //
-    // create tab control
-    //
-    TGTab *tabs = new TGTab(frame, 300, 300);
-
-    //
-    // Create Tab1
-    //
-    TGCompositeFrame *tab1 = tabs->AddTab("PixelList");
-    tab1->ChangeOptions(kHorizontalFrame);
+    M_PREVPIXEL = 0x1000,
+    M_NEXTPIXEL = 0x1001
+};
+
+// --------------------------------------------------------------------------
+//
+//  Add the missing GUI elements: These are the pixel number controls
+//
+void MGFadcDisp::AddSetupElements()
+{
+    fTab1->ChangeOptions(kHorizontalFrame);
 
     //
     // Create first gui element for tab1
     //
-    fPixelList = new TGListBox(tab1, M_PIXELLIST);
+    fPixelList = new TGListBox(fTab1, M_PIXELLIST);
     fPixelList->Associate(this);
     fPixelList->Resize(80, 230);
 
     TGLayoutHints *layplist = new TGLayoutHints(kLHintsExpandY|kLHintsLeft, 5, 5, 5, 5);
-    tab1->AddFrame(fPixelList, layplist);
-
-    //
-    // Crete second gui elemet for tab1 (TGVertical Frame)
-    //
-    TGVerticalFrame *mid1 = new TGVerticalFrame(tab1, 300, 100);
+    fTab1->AddFrame(fPixelList, layplist);
+
+    TGVerticalFrame *fMidFrame = new TGVerticalFrame(fTab1, 300, 100);
+    fList->Add(fMidFrame);
+
+    TGLayoutHints *laytab = new TGLayoutHints(kLHintsRight|kLHintsExpandY, 5, 5, 5, 5);
+    fList->Add(laytab);
+
+    fTab1->AddFrame(fMidFrame, laytab);
 
     //
     // Create gui elements for vertical frame
     //
-    TGTextButton *prevpix = new TGTextButton(mid1, "<< Prev Pixel", M_PREVPIXEL);
-    TGTextButton *nextpix = new TGTextButton(mid1, "Next Pixel >>", M_NEXTPIXEL);
+    TGTextButton *prevpix = new TGTextButton(fMidFrame, "<< Prev Pixel", M_PREVPIXEL);
+    TGTextButton *nextpix = new TGTextButton(fMidFrame, "Next Pixel >>", M_NEXTPIXEL);
     prevpix->Associate(this);
     nextpix->Associate(this);
 
-    TGVSlider *slider = new TGVSlider(mid1, 200, kSlider1|kScaleBoth);
+    TGVSlider *slider = new TGVSlider(fMidFrame, 200, kSlider1|kScaleBoth);
     slider->Associate(this);
     slider->SetRange(0, 576);
@@ -207,149 +101,28 @@
     TGLayoutHints *layslider = new TGLayoutHints(kLHintsCenterX|kLHintsExpandY);
 
-    mid1->AddFrame(prevpix, laybut);
-    mid1->AddFrame(slider,  layslider);
-    mid1->AddFrame(nextpix, laybut);
-
-    TGLayoutHints *laytab    = new TGLayoutHints(kLHintsRight|kLHintsExpandY, 5, 5, 5, 5);
-    tab1->AddFrame(mid1, laytab);
-
-    TGLayoutHints *laytabs   = new TGLayoutHints(kLHintsNormal|kLHintsExpandY, 10, 10, 10, 10);
-    frame->AddFrame(tabs, laytabs);
-
-    //
-    // Create second part of frame
-    // 
-    TGTab *tabdisp = new TGTab(frame, 300, 300);
-
-    TGCompositeFrame *tab2 = tabdisp->AddTab("Digital Scope");
-
-    TRootEmbeddedCanvas *canvas = new TRootEmbeddedCanvas("Digi Scope", tab2, 400, 400);
-
-    TGLayoutHints *laycanvas = new TGLayoutHints(kLHintsCenterX|kLHintsCenterY|kLHintsExpandX|kLHintsExpandY);
-    tab2->AddFrame(canvas, laycanvas);
-
-    fCanvas = canvas->GetCanvas();
-
-    //
-    // Add second part to frame
-    //
-    TGLayoutHints *laydisp = new TGLayoutHints(kLHintsNormal|kLHintsExpandY|kLHintsExpandX, 10, 10, 10, 10);
-    frame->AddFrame(tabdisp, laydisp);
-
-    //
-    // Now add all gui elements to 'autodel'-list
-    //
-    fList->Add(tabdisp);
-    fList->Add(canvas);
-    fList->Add(laycanvas);
-    fList->Add(laydisp);
-    fList->Add(fPixelList);
-    fList->Add(layplist);
-    fList->Add(mid1);
-    fList->Add(prevpix);
-    fList->Add(laybut);
-    fList->Add(slider);
-    fList->Add(layslider);
-    fList->Add(nextpix);
-    fList->Add(laytab);
-    fList->Add(laytabs);
-
-}
-
-void MGFadcDisp::AddLowFrame(TGHorizontalFrame *frame)
-{
-    TGTextButton *but1 = new TGTextButton(frame, "Print", M_PRINT);
-    TGTextButton *but2 = new TGTextButton(frame, "Close", M_CLOSE);
-
-    but1->Associate(this);
-    but2->Associate(this);
-
-    fList->Add(but1);
-    fList->Add(but2);
-
-    TGLayoutHints *laybut = new TGLayoutHints(kLHintsLeft, 10, 10, 10, 10);
-    fList->Add(laybut);
-
-    frame->AddFrame(but1, laybut);
-    frame->AddFrame(but2, laybut);
-}
-
-void MGFadcDisp::CreateGui(const char *filename, const char *treename)
-{
-    //
-    // Create the frame elements and add gui elements to it
-    //
-    TGVerticalFrame *frametop = new TGVerticalFrame(this, 300, 100);
-    AddTopFramePart1(frametop, filename, treename);
-    AddTopFramePart2(frametop);
-
-    TGHorizontal3DLine *line1   = new TGHorizontal3DLine(this);
-
-    TGHorizontalFrame *framemid = new TGHorizontalFrame(this, 300, 100);
-    AddMidFrame(framemid);
-
-    TGHorizontal3DLine *line2   = new TGHorizontal3DLine(this);
-
-    TGHorizontalFrame *framelow = new TGHorizontalFrame(this, 300, 100);
-    AddLowFrame(framelow);
-
-    //
-    // add frame elements to 'autodel'
-    //
-    fList->Add(frametop);
-    fList->Add(line1);
-    fList->Add(framemid);
-    fList->Add(line2);
-    fList->Add(framelow);
-
-    //
-    // Layout frame elements and add elements to frame
-    //
-    TGLayoutHints *laytop  = new TGLayoutHints(kLHintsTop|kLHintsCenterX);
-    TGLayoutHints *layline = new TGLayoutHints(kLHintsTop|kLHintsExpandX);
-    TGLayoutHints *laymid  = new TGLayoutHints(kLHintsExpandY|kLHintsExpandX);
-    TGLayoutHints *laylow  = new TGLayoutHints(kLHintsTop);
-
-    fList->Add(laytop);
-    fList->Add(layline);
-    fList->Add(laymid);
-    fList->Add(laylow);
-
-    AddFrame(frametop, laytop);
-    AddFrame(line1,    layline);
-    AddFrame(framemid, laymid);
-    AddFrame(line2,    layline);
-    AddFrame(framelow, laylow);
-}
-
-void MGFadcDisp::SetupFileAccess(const char *filename, const char *treename)
-{
-    //
-    // Create the file access elements
-    //
-    fEvtData = new MRawEvtData();
-
-    pList = new MParList();
-    pList->AddToList(fEvtData);
-
-    fReadTree = new MReadTree(treename, filename);
-    fReadTree->PreProcess(pList);
-    fReadTree->GetEvent();
-}
-
+    fMidFrame->AddFrame(prevpix, laybut);
+    fMidFrame->AddFrame(slider,  layslider);
+    fMidFrame->AddFrame(nextpix, laybut);
+}
+
+// --------------------------------------------------------------------------
+//
+//  Constructor
+//
 MGFadcDisp::MGFadcDisp(char *filename, char *treename,
                        const TGWindow *p, const TGWindow *main,
                        UInt_t w, UInt_t h)
-    : TGTransientFrame(p, main, w, h)
-{
-
-    //
-    //  create an autodelete-list for the gui elements
-    //
-    fList = new TList;
-    fList->SetOwner();
-
-    SetupFileAccess(filename, treename);
-    CreateGui(filename, treename);
+    : MGEvtDisplay(filename, treename, p, main, w, h)
+{
+    //
+    // Add the missing GUI elements (pixellist, pixel number controls)
+    //
+    AddSetupElements();
+
+    //
+    // preprocess eventloop and read in first event (process)
+    //
+    fEvtLoop->PreProcess();
+    GetTaskList()->Process();
 
     //
@@ -362,60 +135,42 @@
     Layout();
 
-    SetWindowName("FadcDisplay");
-    SetIconName("FadcDisp");
+    SetWindowName("Fadc Event Display");
+    SetIconName("Fadc");
+
+    UpdateDisplay();
+    UpdateNumOfEvts();
+    UpdateEventCounter();
 
     MapWindow();
 
-    CreatePixelList();
-    UpdateEventCounter();
-}
-
-
-MGFadcDisp::~MGFadcDisp()
-{
-    //
-    // close the file
-    //
-    fReadTree->PostProcess();
-
-    delete fEvtData;
-    delete pList;
-
-    delete fReadTree;
-
-    //
-    //   destruct the graphical members
-    //
-    delete fList;
-}
-
-
-void MGFadcDisp::CloseWindow()
-{
-   // Got close message for this MainFrame. Calls parent CloseWindow()
-   // (which destroys the window) and terminate the application.
-   // The close message is generated by the window manager when its close
-   // window menu item is selected.
-
-    delete this;
-}
-       
-
+}
+
+// --------------------------------------------------------------------------
+//
+//  return pointer to event data
+//
+MRawEvtData *MGFadcDisp::GetEvent() const
+{
+    return (MRawEvtData*)GetParList()->FindObject("MRawEvtData");
+}
+
+// --------------------------------------------------------------------------
+//
+//   after a new event is read in one has to update
+//   the list of pixels in the fPixelList (TGListBox)
+//
 void MGFadcDisp::CreatePixelList(Int_t lastsel)
 {
-    //
-    //   after a new event is read in one has to update
-    //   the list of pixels in the fPixelList (TGListBox)
-    //
+    MRawEvtData *data = GetEvent();
 
     //
     //   put the selection of the last event in memory
     //
-    MRawEvtPixelIter pixel(fEvtData);
+    MRawEvtPixelIter pixel(data);
     while (pixel.Next())
     {
-        char wortdummy[100];
-        sprintf(wortdummy, "%d", pixel.GetPixelId());
-        fPixelList->AddEntry(wortdummy, pixel.GetPixelId());
+        char txt[100];
+        sprintf(txt, "%d", pixel.GetPixelId());
+        fPixelList->AddEntry(txt, pixel.GetPixelId());
     }
 
@@ -433,10 +188,9 @@
         pixel.Reset();
         lastsel=pixel.GetPixelId();
-
     }
 
-    char wortdummy[100];
-    sprintf(wortdummy, "GRAPH%d", lastsel);
-    fEvtData->Draw(wortdummy);
+    char txt[100];
+    sprintf(txt, "GRAPH%d", lastsel);
+    data->Draw(txt);
     fPixelList->Select(lastsel, kTRUE);
 
@@ -445,54 +199,31 @@
 }
 
-void MGFadcDisp::UpdateEventCounter() 
-{
-    //     Update the event counter
-
-    char wortdummy[256];
-
-    sprintf(wortdummy, "%d", fReadTree->GetEventNum());
-
-    fTxtEvtNr->SetText(wortdummy);
-}
-
-void MGFadcDisp::ReadinEvent(UInt_t iEvt)
-{
-    Int_t buttons = 4;
-    Int_t retval  = 0;
-
-    //  first check if the new event is in the range of possible events
-  
-    if (iEvt >= fReadTree->GetEntries())
-    {
-        new TGMsgBox(fClient->GetRoot(), this,
-                     "WARNING!",
-                     "The event number is out of range!!!",
-                     kMBIconExclamation, buttons, &retval);
-    }
-    else
-    {
-        const Int_t lastsel = fPixelList->GetSelected();
-
-        fPixelList->RemoveEntries(0, fEvtData->GetNumPixels());
-
-        fReadTree->SetEventNum(iEvt);
-        fReadTree->GetEvent();
-
-        CreatePixelList(lastsel);
-    }
-
-    UpdateEventCounter();
-}
-
+// --------------------------------------------------------------------------
+//
+//  Update the contents of the canvas
+//
+void MGFadcDisp::UpdateDisplay()
+{
+    const Int_t lastsel = fPixelList->GetSelected();
+
+    fPixelList->RemoveEntries(0, GetEvent()->GetNumPixels());
+
+    CreatePixelList(lastsel);
+}
+
+// --------------------------------------------------------------------------
+//
+//  Display another pixel
+//
 void MGFadcDisp::DisplayPix(UInt_t i)
 {
-    char wortdummy[256];
-
-    sprintf(wortdummy, "GRAPH%d", i);
+    MRawEvtData *data = GetEvent();
 
     fCanvas->Clear();
     fCanvas->cd();
 
-    fEvtData->Draw(wortdummy);
+    char txt[256];
+    sprintf(txt, "GRAPH%d", i);
+    data->Draw(txt);
 
     fCanvas->Modified();
@@ -502,21 +233,19 @@
     // FIXME: too complicated!
     //
-    fPixelList->RemoveEntries(0, fEvtData->GetNumPixels());
+    fPixelList->RemoveEntries(0, data->GetNumPixels());
     CreatePixelList(i);
 }
 
+// --------------------------------------------------------------------------
+//
+//    ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
+//
+// Processes information from all GUI items.
+// Selecting an item usually generates an event with 4 parameters.
+// The first two are packed into msg (first and second bytes).
+// The other two are parm1 and parm2.
+//
 Bool_t MGFadcDisp::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2) 
 {
-    //------------------------------------------------------------------
-    //
-    //    ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
-    //
-    // Processes information from all GUI items.
-    // Selecting an item usually generates an event with 4 parameters.
-    // The first two are packed into msg (first and second bytes).
-    // The other two are parm1 and parm2.
-    //
-    //------------------------------------------------------------------
-
     switch(GET_MSG(msg))
     {
@@ -527,12 +256,4 @@
             switch (parm1)
             {
-            case M_PREVEVT:
-                ReadinEvent(fReadTree->GetEventNum()-1);
-                return kTRUE;
-
-            case M_NEXTEVT:
-                ReadinEvent(fReadTree->GetEventNum()+1);
-                return kTRUE;
-
             case M_PREVPIXEL:
                 DisplayPix(fPixelList->GetSelected()-1);
@@ -542,31 +263,17 @@
                 DisplayPix(fPixelList->GetSelected()+1);
                 return kTRUE;
-
-            case M_PRINT:
-                cout << "Sorry, not yet implemented!" << endl;
-                return kTRUE;
-
-            case M_CLOSE:
-                CloseWindow();
-                return kTRUE;
             }
-            return kTRUE;
+            break;
 
         case kCM_LISTBOX:
             if (parm1 != M_PIXELLIST)
-                return kTRUE;
+                break;
 
             DisplayPix(fPixelList->GetSelected());
             return kTRUE;
         }
-        return kTRUE;
-
-    case kC_TEXTENTRY:
-        if (GET_SUBMSG(msg) == kTE_ENTER)
-            ReadinEvent(atoi(fTxtEvtNr->GetText()));
-
-        return kTRUE;
+        break;
     }
 
-    return kTRUE;
-}
+    return MGEvtDisplay::ProcessMessage(msg, parm1, parm2);
+}
Index: trunk/MagicSoft/Mars/meventdisp/MGFadcDisp.h
===================================================================
--- trunk/MagicSoft/Mars/meventdisp/MGFadcDisp.h	(revision 957)
+++ trunk/MagicSoft/Mars/meventdisp/MGFadcDisp.h	(revision 959)
@@ -6,49 +6,22 @@
 #endif
 
-#ifndef ROOT_TGFrame
-#include <TGFrame.h>
+#ifndef MGEVTDISPLAY_H
+#include "MGEvtDisplay.h"
 #endif
 
-class MParList;
-class MReadTree;
+class TGListBox;
 class MRawEvtData;
 
-class TList;
-class TCanvas;
-class TGListBox;
-class TGTextEntry;
-
-class MGFadcDisp : public TGTransientFrame
+class MGFadcDisp : public MGEvtDisplay
 {
 private:
-    //
-    // GUI stuff
-    //
-    TList       *fList;
-
-    TGTextEntry *fTxtEvtNr;
     TGListBox   *fPixelList;
 
-    TCanvas     *fCanvas;
+    void AddSetupElements();
+    void DisplayPix(UInt_t i);
+    void UpdateDisplay();
+    void CreatePixelList(Int_t lastsel=-1);
 
-    void AddTopFramePart1(TGVerticalFrame *frame,
-                          const char *filename,
-                          const char *treename);
-    void AddTopFramePart2(TGVerticalFrame *frame);
-    void AddMidFrame(TGHorizontalFrame *frame);
-    void AddLowFrame(TGHorizontalFrame *frame);
-
-    void CreateGui(const char *filename, const char *treename);
-    void SetupFileAccess(const char *filename, const char *treename);
-
-    //
-    // File Access stuff
-    //
-    MParList    *pList;
-    MRawEvtData *fEvtData;
-    MReadTree   *fReadTree;
-
-    void ReadinEvent(UInt_t iEvt);
-    void DisplayPix(UInt_t i);
+    MRawEvtData *GetEvent() const;
 
 public:
@@ -56,11 +29,4 @@
     MGFadcDisp(char *filename, char *treename,
                const TGWindow *p, const TGWindow *main, UInt_t w, UInt_t h);
-
-    ~MGFadcDisp();
-
-    void CloseWindow();
-
-    void CreatePixelList(Int_t lastsel=-1);
-    void UpdateEventCounter();
 
     virtual Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2);
Index: trunk/MagicSoft/Mars/meventdisp/Makefile
===================================================================
--- trunk/MagicSoft/Mars/meventdisp/Makefile	(revision 957)
+++ trunk/MagicSoft/Mars/meventdisp/Makefile	(revision 959)
@@ -22,5 +22,5 @@
 #  connect the include files defined in the config.mk file
 #
-INCLUDES = -I. -I../mbase -I../mraw
+INCLUDES = -I. -I../mbase -I../mraw -I../mgui -I../manalysis
 
 #------------------------------------------------------------------------------
@@ -28,5 +28,7 @@
 .SUFFIXES: .c .cc .cxx .h .hxx .o 
 
-SRCFILES = MGFadcDisp.cc
+SRCFILES = MGEvtDisplay.cc \
+	   MGFadcDisp.cc \
+	   MGCamDisplay.cc
 
 SRCS    = $(SRCFILES)
