ROOT logo

#ifndef __CINT__
#include "AliOADBForward.h"
#include <TGListBox.h>
#include <TGNumberEntry.h>
#include <TGTextEntry.h>
#include <TGComboBox.h>
#include <TGFrame.h>
#include <TGFileDialog.h>
#include <TGButtonGroup.h>
#include <TGButton.h>
#include <TGLabel.h>
#include <TGMsgBox.h>
#include <TSystem.h>
#include <TError.h>
#include <TTimer.h>
#include <TCanvas.h>
#include <TTree.h>
#include <TGListView.h>
#include <TDatime.h>
#include <TParameter.h>
#include <TPaveText.h>
#include <TBrowser.h>

namespace {
  void 
  ForwardOADBGUIErrorHandler(Int_t lvl, Bool_t doAbort, 
			     const char* location, 
			     const char* msg)
  {
    if (!doAbort && lvl >= kWarning) {
      EMsgBoxIcon msgIcon = kMBIconAsterisk;
      // if (lvl >= kInfo)    msgIcon = kMBIconAsterisk;
      if (lvl >= kWarning) msgIcon = kMBIconExclamation;
      if (lvl >= kError)   msgIcon = kMBIconStop;
      
      new TGMsgBox(gClient->GetRoot(), gClient->GetRoot(), 
		   location, msg, msgIcon);
    }
    DefaultErrorHandler(lvl, doAbort, location, msg);
  }
}
#else 
class AliOADBForward;
class AliOADBForward::Entry;
// #if 0
class TGTransientFrame;
class TGFrame;
class TGLVEntry;
class TGHorizontalFrame;
class TGTextButton;
class TGCheckButton;
class TGTextEntry;
class TGVerticalFrame;
class TGLabel;
class TGComboBox;
class TGMainFrame;
class TGListView;
class TGLVContainer;
class TGHButtonGroup;
class TGLayoutHints;
class TGNumberEntry;
// #endif
#endif

struct ForwardOADBDialog
{
  ForwardOADBDialog(TGMainFrame* p)
    : fFrame(gClient->GetRoot(), p, 200, 40, kVerticalFrame),
      fHints(kLHintsExpandX,30,30,30,30),
      fLabel(&fFrame, ""), 
      // fProgress(&fFrame, 100), 
      fIsShown(false),
      fIncrement(0,false)
  {
    fFrame.AddFrame(&fLabel, &fHints );
    // fFrame.AddFrame(&fProgress, &fHints);
    fFrame.SetWindowName("Please wait ...");
    // fProgress.SetRange(0,1);
    fIncrement.Connect("Timeout()","ForwardOADBDialog",this,"HandleIncr()");
  }
  ForwardOADBDialog(const ForwardOADBDialog&) {}
  ForwardOADBDialog& operator=(const ForwardOADBDialog&) { return *this; }
  void HandleIncr()
  {
    // Float_t dp = 0.1;
    // Float_t p  = fProgress.GetPosition();
    // Info("HandleIncr", "Handing increment (%f)", p);
    // if (p+dp >= 1) fProgress.SetPosition(0);
    // fProgress.Increment(dp);
    // fFrame.GetClient()->NeedRedraw(&fFrame);
  }
  void Show(const char* msg)
  {
    fLabel.SetText(msg);
    // fProgress.SetPosition(0);
    fFrame.MapSubwindows();
    Int_t width  = fFrame.GetDefaultWidth();
    Int_t height = fFrame.GetDefaultHeight();
    fFrame.Resize(width, height);
    fFrame.SetWMSize(width, height);
    fFrame.SetWMSizeHints(width, height, width, height, 0, 0);
    fFrame.MapRaised();
    fIsShown = true;
    // fIncrement.Start(0,false);
    fFrame.GetClient()->WaitForUnmap(&fFrame);    
  }
  void Hide() 
  {
    if (!fIsShown) return;
    // fIncrement.Stop();
    fFrame.UnmapWindow();
  }
  TGTransientFrame fFrame;
  TGLayoutHints    fHints;
  TGLabel          fLabel;
  //TGHProgressBar   fProgress;
  Bool_t           fIsShown;
  TTimer           fIncrement;
};
    
struct ForwardOADBGUI
{
  enum { 
    kLabelWidth = 200
  };
  ForwardOADBGUI()
    : fMain(gClient->GetRoot(), 10, 10, kVerticalFrame),
      fOpenFrame(&fMain),
      fFileText(&fOpenFrame, "fmd_corrections.root"),
      fFileSelect(&fOpenFrame, "Browse"), 
      fTablesText(&fOpenFrame, "*"),
      fOpenButton(&fOpenFrame, "Open"),
      fRWButton(&fOpenFrame, "R/W"),
      fCloseButton(&fOpenFrame, "Close"),
      fSelectFrame(&fMain), 
      fTableFrame(&fSelectFrame), 
      fTableLabel(&fTableFrame, "Table: "), 
      fTableSelect(&fTableFrame),
      fRunFrame(&fSelectFrame), 
      fRunLabel(&fRunFrame, "Run: "), 
      fRunInput(&fRunFrame, 0, 0, -1, 
		TGNumberFormat::kNESReal,
		TGNumberFormat::kNEANonNegative,
		TGNumberFormat::kNELLimitMin, 0),
    fRunMode(&fRunFrame),
    fSysFrame(&fSelectFrame), 
    fSysLabel(&fSysFrame, "System: "), 
    fSysSelect(&fSysFrame),
    fSNNFrame(&fSelectFrame), 
    fSNNLabel(&fSNNFrame, "sqrt(sNN) [GeV]: "), 
    fSNNInput(&fSNNFrame, 0, 0, -1, TGNumberFormat::kNESReal,
	      TGNumberFormat::kNEANonNegative,
	      TGNumberFormat::kNELLimitMin, 0),
    fFldFrame(&fSelectFrame), 
    fFldLabel(&fFldFrame, "L3 field [kG]: "), 
    fFldSelect(&fFldFrame),
    fOtherFrame(&fSelectFrame),
    fMCButton(&fOtherFrame, "MC"),
    fSatButton(&fOtherFrame, "Satellite"),
    fOptionsFrame(&fSelectFrame), 
    fOptionsLabel(&fOptionsFrame, "Draw/Print options:"),
    fOptionsText(&fOptionsFrame, ""),
    fCommandFrame(&fSelectFrame), 
    fQueryButton(&fCommandFrame, "Query"),
    fListButton(&fCommandFrame, "List table"),
    fPrintButton(&fCommandFrame, "Print entry"),
    fCopyButton(&fCommandFrame, "Copy entry"),
    fDrawButton(&fCommandFrame, "Draw entry"),
    fPDFButton(&fCommandFrame, "Summarize entry"),
    fList(&fMain, 800, 400), 
    fListContainer(&fList),
    fFrameHints(kLHintsExpandX, 0, 0, 2, 0),
    fLabelHints(kLHintsNoHints, 4, 2, 0, 0),
    fEntryHints(kLHintsExpandX|kLHintsExpandY, 2, 4, 0, 0),
    fButtonHints(kLHintsExpandX, 2, 2, 0, 0),
    fListHints(kLHintsExpandX|kLHintsExpandY, 2, 2, 4, 2),
    fMsg(&fMain),
    fDB(0),
    fEntry(0)
  {
    fMain.Connect("CloseWindow()", "ForwardOADBGUI", this, "HandleKill()");
    fMain.DontCallClose();

    fFileSelect.Connect("Clicked()", "ForwardOADBGUI", this, "HandleBrowse()");
    fOpenButton.Connect("Clicked()", "ForwardOADBGUI", this, "HandleOpen()");
    fCloseButton.Connect("Clicked()", "ForwardOADBGUI", this, "HandleClose()");
    fMain.AddFrame(&fOpenFrame, &fFrameHints);
    fOpenFrame.AddFrame(&fFileText, &fEntryHints);
    fOpenFrame.AddFrame(&fFileSelect, &fEntryHints);
    fOpenFrame.AddFrame(&fTablesText, &fEntryHints);
    fOpenFrame.AddFrame(&fOpenButton, &fEntryHints);
    fOpenFrame.AddFrame(&fRWButton,   &fButtonHints);
    fOpenFrame.AddFrame(&fCloseButton, &fEntryHints);

    fMain.AddFrame(&fSelectFrame, &fFrameHints);

    fTableLabel.SetWidth(kLabelWidth); fTableLabel.SetMinWidth(kLabelWidth);
    fTableSelect.SetHeight(22);
    fTableSelect.Connect("Selected(Int_t)","ForwardOADBGUI",this,
			 "HandleTable(Int_t)");
    fSelectFrame.AddFrame(&fTableFrame, &fFrameHints);
    fTableFrame.AddFrame(&fTableLabel, &fLabelHints);
    fTableFrame.AddFrame(&fTableSelect, &fEntryHints);
    
    fRunLabel.SetWidth(kLabelWidth); fRunLabel.SetMinWidth(kLabelWidth);
    fRunMode.AddEntry("default", 0);
    fRunMode.AddEntry("Exact",  1);
    fRunMode.AddEntry("Newest", 2);
    fRunMode.AddEntry("Near",   3);
    fRunMode.AddEntry("Older",  4);
    fRunMode.AddEntry("Newer",  5);
    fRunMode.SetHeight(22);
    fSelectFrame.AddFrame(&fRunFrame, &fFrameHints);
    fRunFrame.AddFrame(&fRunLabel, &fLabelHints);
    fRunFrame.AddFrame(&fRunInput, &fEntryHints);
    fRunFrame.AddFrame(&fRunMode, &fEntryHints);

    fSysLabel.SetWidth(kLabelWidth); fSysLabel.SetMinWidth(kLabelWidth);
    fSysSelect.AddEntry("- select -", 0);
    fSysSelect.AddEntry("p-p",   1);
    fSysSelect.AddEntry("Pb-Pb ",2);
    fSysSelect.AddEntry("p-Pb",  3);
    fSysSelect.SetHeight(22);
    fSelectFrame.AddFrame(&fSysFrame, &fFrameHints);
    fSysFrame.AddFrame(&fSysLabel, &fLabelHints);
    fSysFrame.AddFrame(&fSysSelect, &fEntryHints);

    fSNNLabel.SetWidth(kLabelWidth); fSNNLabel.SetMinWidth(kLabelWidth);
    fSNNInput.SetHeight(22);
    fSelectFrame.AddFrame(&fSNNFrame, &fFrameHints);
    fSNNFrame.AddFrame(&fSNNLabel, &fLabelHints);
    fSNNFrame.AddFrame(&fSNNInput, &fEntryHints);

    fFldLabel.SetWidth(kLabelWidth); fFldLabel.SetMinWidth(kLabelWidth);
    fFldSelect.AddEntry("- select -", 999);
    fFldSelect.AddEntry("-5", -5);
    fFldSelect.AddEntry("0 ",  0);
    fFldSelect.AddEntry("+5", +5);
    fFldSelect.SetHeight(22);
    fSelectFrame.AddFrame(&fFldFrame, &fFrameHints);
    fFldFrame.AddFrame(&fFldLabel, &fLabelHints);
    fFldFrame.AddFrame(&fFldSelect, &fEntryHints);

    fSelectFrame.AddFrame(&fOtherFrame, &fFrameHints);
    fOtherFrame.SetLayoutHints(&fButtonHints);
    fMCButton.AllowStayDown(true);
    fSatButton.AllowStayDown(true);
    // fOtherFrame.AddFrame(&fMCButton, &fEntryHints);
    // fOtherFrame.AddFrame(&fSatButton, &fEntryHints);
    // new TGCheckButton(&fOtherFrame, "MC:");
    // new TGCheckButton(&fOtherFrame, "Satellite:");

    fOptionsLabel.SetWidth(2*kLabelWidth);
    fSelectFrame.AddFrame(&fOptionsFrame, &fFrameHints);
    fOptionsFrame.AddFrame(&fOptionsLabel, &fLabelHints);
    fOptionsFrame.AddFrame(&fOptionsText, &fEntryHints);

    Info("", "Connecting signals");
    fQueryButton.Connect("Clicked()", "ForwardOADBGUI", this, "HandleQuery()");
    fListButton.Connect("Clicked()", "ForwardOADBGUI", this, "HandleList()");
    fDrawButton.Connect("Clicked()", "ForwardOADBGUI", this, "HandleDraw()");
    fCopyButton.Connect("Clicked()", "ForwardOADBGUI", this, "HandleCopy()");
    fPDFButton.Connect("Clicked()", "ForwardOADBGUI", this, "HandlePDF()");
    fPrintButton.Connect("Clicked()", "ForwardOADBGUI", this, "HandlePrint()");
    fSelectFrame.AddFrame(&fCommandFrame, &fFrameHints);
    fCommandFrame.SetLayoutHints(&fButtonHints);
    
    // fList          = new TGListView(&fMain, 800, 400);
    // fListContainer = new TGLVContainer(fList);
    fListContainer.SetColHeaders("Entry", 
				 "Run", 
				 "System", 
				 "sqrt(sNN)", 
				 "L3 Field", 
				 "Type", 
				 "IP",
				 "Date",
				 "Author",
				 "AliROOT",
				 "Data");
    fList.SetViewMode(kLVDetails);
    fList.Connect("Clicked(TGLVEntry*,Int_t)", 
		   "ForwardOADBGUI", this, "HandleItem(TGLVEntry*,Int_t)");
    fList.Connect("DoubleClicked(TGLVEntry*,Int_t)", 
		   "ForwardOADBGUI", this, "HandleItem(TGLVEntry*,Int_t)");
    fListContainer.Connect("Clicked(TGFrame*,Int_t)",
			    "ForwardOADBGUI", this, 
			    "HandleItem(TGFrame*,Int_t)");
    fList.SetMinWidth(400);
    fList.SetMinHeight(200);
    fMain.AddFrame(&fList, &fListHints);
    
#ifndef __CINT__
    ::SetErrorHandler(ForwardOADBGUIErrorHandler);
#endif
    HandleEnable();

    fMain.SetMinWidth(600);
    fMain.SetMinHeight(480);
    fMain.MapSubwindows();    
    fMain.Resize(600, 480); // fMain.GetDefaultSize());
    fMain.MapWindow();
  }
  ~ForwardOADBGUI()
  {
    HandleClose();
#ifndef __CINT__
    ::SetErrorHandler(::DefaultErrorHandler);
#endif
    Info("~ForwardOADBGUI", "Closing");
  }
  ForwardOADBGUI(const ForwardOADBGUI&) 
    : fMain(gClient->GetRoot(), 10, 10, kVerticalFrame),
      fOpenFrame(&fMain),
      fFileText(&fOpenFrame, ""),
      fFileSelect(&fOpenFrame, ""), 
      fTablesText(&fOpenFrame, ""),
      fOpenButton(&fOpenFrame, ""),
      fRWButton(&fOpenFrame, ""),
      fCloseButton(&fOpenFrame, ""),
      fSelectFrame(&fMain), 
      fTableFrame(&fSelectFrame), 
      fTableLabel(&fTableFrame, ""), 
      fTableSelect(&fTableFrame),
      fRunFrame(&fSelectFrame), 
      fRunLabel(&fRunFrame, ""), 
      fRunInput(&fRunFrame),
    fRunMode(&fRunFrame),
    fSysFrame(&fSelectFrame), 
    fSysLabel(&fSysFrame, ""), 
    fSysSelect(&fSysFrame),
    fSNNFrame(&fSelectFrame), 
    fSNNLabel(&fSNNFrame, ""), 
    fSNNInput(&fSNNFrame),
    fFldFrame(&fSelectFrame), 
    fFldLabel(&fFldFrame, ""), 
    fFldSelect(&fFldFrame),
    fOtherFrame(&fSelectFrame),
    fMCButton(&fOtherFrame, ""),
    fSatButton(&fOtherFrame, ""),
    fOptionsFrame(&fSelectFrame), 
    fOptionsLabel(&fOptionsFrame, ""),
    fOptionsText(&fOptionsFrame, ""),
    fCommandFrame(&fSelectFrame), 
    fQueryButton(&fCommandFrame, ""),
    fListButton(&fCommandFrame, ""),
    fPrintButton(&fCommandFrame, ""),
    fCopyButton(&fCommandFrame, ""),
    fDrawButton(&fCommandFrame, ""),
    fPDFButton(&fCommandFrame, ""),
    fList(&fMain, 800, 400), 
    fListContainer(&fList),
    fFrameHints(),
    fLabelHints(),
    fEntryHints(),
    fButtonHints(),
    fListHints(),
    fMsg(0),
    fDB(0),
    fEntry(0)
  {}
  ForwardOADBGUI& operator=(const ForwardOADBGUI&) { return *this; }

  void UseDB(AliOADBForward* db)
  {
    if (!db) return;

    if (fDB) HandleClose();
    fEntry = 0;
    fDB = db;

    TString lt;
    const TMap& tables = fDB->GetTables();
    TIter next(&tables);
    TObject* key = 0;
    // Int_t    i   = 0;
    while ((key = next())) {
      AliOADBForward::Table* t = fDB->FindTable(key->GetName());
      
      lt.Append(Form("%s/%s", t->GetName(), t->fTree->GetTitle()));
    }
    fTablesText.SetText(lt);
    HandleEnable();    
  }
  void HandleKill()
  {
    // fMain.DontCallClose();
    fMain.DeleteWindow();
    Printf("Starting timer");
    // TTimer* t = new TTimer(Form("delete (ForwardOADBGUI*)%p", this), 100);
    // t->Start(100, true);
  }
  void HandleDBEntry(AliOADBForward::Entry* e)
  {
    Info("HandleDBEntry", "Selected entry %p", e);
    Bool_t en = (e != 0);
    fDrawButton.SetEnabled(en);
    fCopyButton.SetEnabled(en);
    fPrintButton.SetEnabled(en);
    fPDFButton.SetEnabled(en);
    
    fEntry = e;
  }
  void HandleEnable()
  {
    Bool_t enabled = fDB ? true : false;
    Bool_t hasTable = fTableSelect.GetSelected() != 0;

    fTableSelect.SetEnabled(enabled);
    fRunMode.SetEnabled(enabled);
    fSysSelect.SetEnabled(enabled);
    fFldSelect.SetEnabled(enabled);
    fMCButton.SetEnabled(enabled);
    fSatButton.SetEnabled(enabled);
    fQueryButton.SetEnabled(enabled && hasTable);
    fListButton.SetEnabled(enabled && hasTable);
    fPrintButton.SetEnabled(enabled && hasTable);
    fDrawButton.SetEnabled(enabled && hasTable);
    fCopyButton.SetEnabled(enabled && hasTable);
    fPDFButton.SetEnabled(enabled && hasTable);
    fOpenButton.SetEnabled(!enabled);
    fCloseButton.SetEnabled(enabled);
    HandleDBEntry(0);

    Int_t tsel = 0;
    if (!enabled) {
      fTableSelect.RemoveAll();
      fTableSelect.AddEntry("- select -", 0);
    }
    else {
      const TMap& tables = fDB->GetTables();
      TIter next(&tables);
      TObject* key = 0;
      Int_t    i   = 0;
      while ((key = next())) {
	fTableSelect.AddEntry(key->GetName(), ++i);
      }    
      if (tables.GetEntries() == 1) tsel = 1;
    }
    fTableSelect.Select(tsel, true);
    fSysSelect.Select(0, true);
    fFldSelect.Select(999, true);
    fRunMode.Select(0, true);

    fMain.Layout();
  }
  void HandleClose()
  {
    if (fDB) { 
      delete fDB;
      fDB = 0;
    }
    HandleEnable();
  }
  void HandleOpen()
  {
    if (fDB) HandleClose();
    Bool_t rw = fRWButton.IsOn();
    fDB = new AliOADBForward;
    Info("HandleOpen", "Opening DB file %s for tables %s", 
	 fFileText.GetText(), fTablesText.GetText());
    TString fn(fFileText.GetText());
    TString tn(fTablesText.GetText());
    if (!fDB->Open(fn, tn, rw, true, true)) { 
      Error("HandleOpen", "Failed to open database");
      delete fDB;
      fDB = 0;
    }
    // else 
    // fDB->Print();
    HandleEnable();
  }
  void HandleBrowse()
  {
    TGFileInfo fi;
    TString iniDir(gSystem->ExpandPathName("$(OADB_PATH)"));
    if (iniDir.IsNull()) 
      iniDir = gSystem->ExpandPathName("$(ALICE_ROOT)/OADB");
    iniDir.Append("/PWGLF/FORWARD/CORRECTIONS/data");
    char* ini = new char[iniDir.Length()+1];
    for (int i = 0; i < iniDir.Length(); i++) ini[i] = iniDir[i];
    ini[iniDir.Length()] = '\0';
    Printf("Initial directory: %s (%s)", iniDir.Data(), ini);
    fi.fIniDir = ini;
    new TGFileDialog(gClient->GetRoot(), &fMain, kFDOpen, &fi);

    TString nf = fi.fFilename; // 
    // nf = gSystem->ConcatFileName(fi.fIniDir, fi.fFilename);
    Info("HandleBrowse", "New file: %s", nf.Data());
    fFileText.SetText(nf);
  }
  void HandleEntry(Int_t i, AliOADBForward::Entry* e) 
  {
    TGLVEntry* lve = new TGLVEntry(&fListContainer, Form("%d", i), "");
    if (i < 0) lve->SetUserData(e);
    lve->SetUniqueID(i);
    TDatime dt(e->fTimestamp);
    lve->SetSubnames(Form("%lu", e->fRunNo), 
		     (e->fSys == 1 ? "p-p" : 
		      e->fSys == 2 ? "Pb-Pb" : 
		      e->fSys == 3 ? "p-Pb" : "?"),
		     Form("%4huGeV",e->fSNN), 
		     Form("%+2hdkG", e->fField), 
		     (e->fMC ? "MC" : "Real"),
		     (e->fSatellite ? "Satellite" : "Nominal"), 
		     dt.AsSQLString(),
		     e->fAuthor, Form("%lu", e->fAliROOTRevision),
		     (e->fData ? e->fData->GetName() : "null"));
    fListContainer.AddItem(lve);
  }
  void HandleList()
  {
    if (!fDB) return;
    TString table;
    SelectedTable(table);

    if (table.IsNull()) {
      // Error("HandleList", "No table selected");
      return;
    }
    HandleDBEntry(0);
    AliOADBForward::Table* t= fDB->FindTable(table);
    if (!t) {
      Error("HandleList", "No table named %s in DB", table.Data());
      return;
    }
    // HandleQuery();
    t->Print(fOptionsText.GetText());
    // if (!fListContainer) return;
    
    fListContainer.RemoveAll();
    TTree* tree = t->fTree;
    Int_t  n    = tree->GetEntries();
    for (Int_t i = 0; i < n; i++) { 
      tree->GetEntry(i);
      AliOADBForward::Entry* e = t->fEntry;
      HandleEntry(i, e);
    }
    fList.AdjustHeaders();
    fMain.Layout();
  }
  void SelectedTable(TString& ret) const
  {
    ret = "";
    TGLBEntry* e = fTableSelect.GetSelectedEntry();
    if (!e) {
      Error("SelectedTable", "No table selected");
      return ;
    }
    ret = e->GetTitle();
  }
  void HandleTable(Int_t id)
  {
    Info("HandleTable", "Id=%d", id);
    fListButton.SetEnabled(id != 0);
    fQueryButton.SetEnabled(id != 0);
    fListContainer.RemoveAll();
    fList.AdjustHeaders();
    fMain.Layout();
    // fPrintButton.SetEnabled(enabled);
    // fDrawButton.SetEnabled(enabled);
    // fPDFButton.SetEnabled(enabled);
  }
  void HandleItem(TGFrame* lve, Int_t btn)
  {
    Info("HandleItem", "frame=%p", lve);
    HandleItem(static_cast<TGLVEntry*>(lve), btn);
  }
  void HandleItem(TGLVEntry* lve, Int_t)
  {
    Info("HandleItem", "entry=%p", lve);
    if (!lve) {
      Warning("HandleItem", "No item");
      return;
    }
    void* data = lve->GetUserData();
    AliOADBForward::Entry* e = 0;
    if (data) { 
      e = reinterpret_cast<AliOADBForward::Entry*>(data);
    }
    else { 
      TString tab;
      SelectedTable(tab);
      if (tab.IsNull()) return;
      
      AliOADBForward::Table* t = fDB->FindTable(tab);
      // Info("HandleItem", "Fetching item %d from table", lve->GetUniqueID());
      t->fTree->GetEntry(lve->GetUniqueID());
      e = t->fEntry;
    }
    if (!e) {
      Warning("HandleItem", "No entry");
      return;
    }
    // if (!gPad) TCanvas::MakeDefCanvas();
    e->Print();
    HandleDBEntry(e);
    // e->fData->Draw();
  }
  void HandlePrint() 
  {
    // TObject* o = HandleQuery();
    // if (!o) return;
    if (!fEntry) { 
      Warning("HandlePrint", "No entry selected");
      return;
    }
    fEntry->fData->Print(fOptionsText.GetText()); 
  }
  void HandleDraw()
  {
    if (!fEntry) { 
      Warning("HandleDraw", "No entry selected");
      return;
    }

    TObject* o = fEntry->fData;
    Info("HandleDraw", "Will draw object of type %s", o->ClassName());
    TString msg;
    if (o->IsA()->InheritsFrom(TParameter<Double_t>::Class())) { 
      TParameter<Double_t>* pd = static_cast<TParameter<Double_t>*>(o);
      msg = Form("%f", pd->GetVal());
    }
    if (o->IsA()->InheritsFrom(TParameter<Float_t>::Class())) { 
      TParameter<Float_t>* pf = static_cast<TParameter<Float_t>*>(o);
      msg = Form("%f", pf->GetVal());
    }
    if (!msg.IsNull()) {
      if (!gPad) TCanvas::MakeDefCanvas();
      
      TPaveText* t = new TPaveText(.1, .1, .9, .9);
      t->AddText(msg);
      t->Draw();
      return;
    }
    CorrDraw(o, false);
    // o->Draw(fOptionsText.GetText()); 
  }
  void HandleCopy()
  {
    TString table;
    SelectedTable(table);
    if (table.IsNull()) return;

    if (!fEntry) { 
      Warning("HandleCopy", "No entry selected");
      return;
    }

    TObject* o = fEntry->fData;
    Info("HandleCopy", "Will copy object of type %s", o->ClassName());


    ULong_t  newRun   = fRunInput.GetHexNumber();
    UShort_t newSys   = fSysSelect.GetSelected();
    UShort_t newSNN   = fSNNInput.GetIntNumber();
    Short_t  newFld   = fFldSelect.GetSelected();
    Bool_t   mc       = fMCButton.IsDown();
    Bool_t   sat      = fSatButton.IsDown();
    ULong_t  oldRun   = fEntry->fRunNo;
    UShort_t oldSys   = fEntry->fSys;
    UShort_t oldSNN   = fEntry->fSNN;
    Short_t  oldFld   = fEntry->fField;

    TString msg;
    msg = Form("Will copy %lu/%hu/%hu/%hd -> %lu/%hu/%hu/%hd (%s,%s) in %s",
	       oldRun, oldSys, oldSNN, oldFld, 
	       newRun, newSys, newSNN, newFld, 
	       (mc ? "mc" : "real"), (sat ? "satellite" : "nominal"),
	       table.Data());
    
    Int_t ret = 0;
    new TGMsgBox(gClient->GetRoot(), gClient->GetRoot(), 
		 "Confirm copy of OADB entry",
		 msg.Data(), 0, kMBOk|kMBCancel, &ret);
    
    if (ret ==  kMBCancel) {
      Info("HandleCopy", "%s CANCELLED", msg.Data());
      return;
    }
    Info("HandleCopy", "%s CONFIRMED", msg.Data());

    if (!fDB->CopyEntry(table, 
			oldRun, oldSys, oldSNN, oldFld, 
			newRun, newSys, newSNN, newFld, 
			mc, sat)) { 
      // Warning("HandleCopy", "Copy failed!");
      return;
    }
    fDB->Update();
    

    // o->Draw(fOptionsText.GetText()); 
  }
  void HandlePDF()
  {
    if (!fEntry) { 
      Warning("HandlePrint", "No entry selected");
      return;
    }


    TObject* o = fEntry->fData;
    gROOT->SetBatch(true);
    CorrDraw(o, true);
    gROOT->SetBatch(false);
    // fEntry->fData->SaveAs(out, fOptionsText.GetText()); 

  }
  void LoadCorrDraw()
  {
    const char* opt = "++g";
    const char* fwd = "$ALICE_ROOT/PWGLF/FORWARD/analysis2";
    gSystem->AddIncludePath(Form("-I$ALICE_ROOT/include -I%s -I%s/scripts",
				 fwd, fwd));
    Info("CorrDraw", "Loading SummaryDrawer.C%s", opt);
    gROOT->LoadMacro(Form("%s/scripts/SummaryDrawer.C%s", fwd, opt));
    // gROOT->ProcessLine(".Class SummaryDrawer");
    Info("CorrDraw", "Loading CorrDrawer.C%s", opt);
    gROOT->LoadMacro(Form("%s/corrs/CorrDrawer.C%s", fwd, opt));
    // gROOT->ProcessLine(".Class SummaryDrawer");
    // gROOT->ProcessLine(".Class CorrDrawer");
    CloseMsg();
  }    
  void CorrDraw(const TObject* o, Bool_t summarize)
  {
    if (!gROOT->GetClass("CorrDrawer")) { 
      TTimer* t = new TTimer(Form("((ForwardOADBGUI*)%p)->LoadCorrDraw()",this),
			     0, kTRUE);
      t->Start(100, true);
      MakeMsg("Compiling drawer");
    }
    o->Print();
    if (summarize) {
      TTimer* t = new TTimer(Form("((ForwardOADBGUI*)%p)"
				  "->DoCorrDraw((TObject*)%p,1)",this, o), 
			     0, kTRUE);
      t->Start(100, true);
      MakeMsg("Drawing to PDF");
    }
    else 
      DoCorrDraw(o, false);
  }
  void DoCorrDraw(const TObject* o, Bool_t summarize) 
  {
    TString cmd(Form("CorrDrawer cd; cd.Summarize((const %s*)%p,%d);",
		     o->ClassName(), o, summarize));
    gROOT->ProcessLine(cmd);
    CloseMsg();
  }  
  void MakeFileName(TString& out) const
  {
    if (!fEntry) return;
    
    SelectedTable(out);
    if (out.IsNull()) return;
    
    out.Append(Form("_run%09lu", fEntry->fRunNo));
    out.Append(Form("_%s", (fEntry->fSys == 1 ? "pp" : 
			    fEntry->fSys == 2 ? "PbPb" :
			    fEntry->fSys == 3 ? "pPb" : "XX")));
    out.Append(Form("_%04huGeV", fEntry->fSNN));
    out.Append(Form("_%c%hukG", fEntry->fField >= 0 ? 'p' : 'm', 
		    TMath::Abs(fEntry->fField)));
    out.Append(Form("_%s", fEntry->fMC ? "mc" : "real"));
    out.Append(Form("_%s", fEntry->fSatellite ? "sat" : "nom"));
    out.Append(".pdf");
  }
  TObject* HandleQuery()
  {
    ULong_t  run   = fRunInput.GetHexNumber();
    Short_t  mode  = fRunMode.GetSelected();
    Short_t  sys   = fSysSelect.GetSelected();
    UShort_t sNN   = fSNNInput.GetIntNumber();
    Short_t  fld   = fFldSelect.GetSelected();
    Bool_t   mc    = fMCButton.IsDown();
    Bool_t   sat   = fSatButton.IsDown();
    TString  tab;
    SelectedTable(tab);
    
    Info("HandleQuery", "tab=%s runNo=%lu mode=%d sys=%d "
	 "sNN=%d fld=%d mc=%d sat=%d", 
	 tab.Data(), run, mode, sys, sNN, fld, mc, sat);

    if (tab.IsNull()) {
      // Error("HandleQuery", "No table selected");
      return 0;
    }
    AliOADBForward::ERunSelectMode qmode = AliOADBForward::kDefault;
    switch (mode) { 
    case 0: qmode = AliOADBForward::kDefault; break;
    case 1: qmode = AliOADBForward::kExact; break;
    case 2: qmode = AliOADBForward::kNewest; break;
    case 3: qmode = AliOADBForward::kNear; break;
    case 4: qmode = AliOADBForward::kOlder; break;
    case 5: qmode = AliOADBForward::kNewer; break;
    }

    Info("HandleQuery", "tab=%s runNo=%lu mode=%d sys=%d "
	 "sNN=%d fld=%d mc=%d sat=%d", 
	 tab.Data(), run, qmode, sys, sNN, fld, mc, sat);

    AliOADBForward::Entry* e = fDB->Get(tab, run, qmode, sys, sNN, 
					fld, mc, sat);
    if (!e) return 0;
    // if (drawNotPrint) e->Inspect();
    // else              e->Print(fOptionsText.GetText());
    e->Print();
    // if (fListContainer) { 
    fListContainer.RemoveAll();
    HandleEntry(-1, e);
    // }
    if (!e->fData) return 0;
    HandleDBEntry(e);

    fList.AdjustHeaders();
    fMain.Layout();

    return e->fData;
  }
  TGMainFrame* GetMain() { return &fMain; }
  void MakeMsg(const char* what) 
  { 
    fMsg.Show(what);
  }
  void CloseMsg()
  {
    Info("CloseMsg", "Closing message window");
    fMsg.Hide();
  }
  TGMainFrame       fMain;
  TGHorizontalFrame fOpenFrame;
  TGTextEntry       fFileText;
  TGTextButton      fFileSelect;
  TGTextEntry       fTablesText;
  TGTextButton      fOpenButton;
  TGCheckButton     fRWButton;
  TGTextButton      fCloseButton;
  TGVerticalFrame   fSelectFrame;
  TGHorizontalFrame fTableFrame;
  TGLabel           fTableLabel;
  TGComboBox        fTableSelect;
  TGHorizontalFrame fRunFrame;
  TGLabel           fRunLabel;
  TGNumberEntry     fRunInput;
  TGComboBox        fRunMode;
  TGHorizontalFrame fSysFrame;
  TGLabel           fSysLabel;
  TGComboBox        fSysSelect;
  TGHorizontalFrame fSNNFrame;
  TGLabel           fSNNLabel;
  TGNumberEntry     fSNNInput;
  TGHorizontalFrame fFldFrame;
  TGLabel           fFldLabel;
  TGComboBox        fFldSelect;
  TGHButtonGroup    fOtherFrame;
  TGTextButton      fMCButton;
  TGTextButton      fSatButton;
  TGHorizontalFrame fOptionsFrame;
  TGLabel           fOptionsLabel;
  TGTextEntry       fOptionsText;
  TGHButtonGroup    fCommandFrame;
  TGTextButton      fQueryButton;  
  TGTextButton      fListButton;
  TGTextButton      fPrintButton;
  TGTextButton      fCopyButton;
  TGTextButton      fDrawButton;
  TGTextButton      fPDFButton;
  TGListView        fList;
  TGLVContainer     fListContainer;
  TGLayoutHints     fFrameHints;
  TGLayoutHints     fLabelHints;
  TGLayoutHints     fEntryHints; 
  TGLayoutHints     fButtonHints;
  TGLayoutHints     fListHints;
  ForwardOADBDialog fMsg;
  AliOADBForward*   fDB;
  AliOADBForward::Entry* fEntry;
  // TCanvas*          fDataCanvas;
  // TCanvas*          fEntryCanvas;
};


TGMainFrame* ForwardOADBGui(AliOADBForward* db=0)
{
  const char* fwd = "$ALICE_ROOT/PWGLF/FORWARD/analysis2";
  if (!gROOT->GetClass("AliOADBForward")) 
    // gSystem->Load("libGui");
    gROOT->Macro(Form("%s/scripts/LoadLibs.C", fwd));
  
  // gSystem->AddIncludePath(Form("-I%s", fwd));
  // gROOT->LoadMacro(Form("%s/corrs/ForwardOADBGUI.C", fwd));

  new TBrowser;
  // new TGClient();
  ForwardOADBGUI* gui = new ForwardOADBGUI();
  if (db) gui->UseDB(db);
  return gui->GetMain();
}
  
//
// EOF
//
  
 ForwardOADBGui.C:1
 ForwardOADBGui.C:2
 ForwardOADBGui.C:3
 ForwardOADBGui.C:4
 ForwardOADBGui.C:5
 ForwardOADBGui.C:6
 ForwardOADBGui.C:7
 ForwardOADBGui.C:8
 ForwardOADBGui.C:9
 ForwardOADBGui.C:10
 ForwardOADBGui.C:11
 ForwardOADBGui.C:12
 ForwardOADBGui.C:13
 ForwardOADBGui.C:14
 ForwardOADBGui.C:15
 ForwardOADBGui.C:16
 ForwardOADBGui.C:17
 ForwardOADBGui.C:18
 ForwardOADBGui.C:19
 ForwardOADBGui.C:20
 ForwardOADBGui.C:21
 ForwardOADBGui.C:22
 ForwardOADBGui.C:23
 ForwardOADBGui.C:24
 ForwardOADBGui.C:25
 ForwardOADBGui.C:26
 ForwardOADBGui.C:27
 ForwardOADBGui.C:28
 ForwardOADBGui.C:29
 ForwardOADBGui.C:30
 ForwardOADBGui.C:31
 ForwardOADBGui.C:32
 ForwardOADBGui.C:33
 ForwardOADBGui.C:34
 ForwardOADBGui.C:35
 ForwardOADBGui.C:36
 ForwardOADBGui.C:37
 ForwardOADBGui.C:38
 ForwardOADBGui.C:39
 ForwardOADBGui.C:40
 ForwardOADBGui.C:41
 ForwardOADBGui.C:42
 ForwardOADBGui.C:43
 ForwardOADBGui.C:44
 ForwardOADBGui.C:45
 ForwardOADBGui.C:46
 ForwardOADBGui.C:47
 ForwardOADBGui.C:48
 ForwardOADBGui.C:49
 ForwardOADBGui.C:50
 ForwardOADBGui.C:51
 ForwardOADBGui.C:52
 ForwardOADBGui.C:53
 ForwardOADBGui.C:54
 ForwardOADBGui.C:55
 ForwardOADBGui.C:56
 ForwardOADBGui.C:57
 ForwardOADBGui.C:58
 ForwardOADBGui.C:59
 ForwardOADBGui.C:60
 ForwardOADBGui.C:61
 ForwardOADBGui.C:62
 ForwardOADBGui.C:63
 ForwardOADBGui.C:64
 ForwardOADBGui.C:65
 ForwardOADBGui.C:66
 ForwardOADBGui.C:67
 ForwardOADBGui.C:68
 ForwardOADBGui.C:69
 ForwardOADBGui.C:70
 ForwardOADBGui.C:71
 ForwardOADBGui.C:72
 ForwardOADBGui.C:73
 ForwardOADBGui.C:74
 ForwardOADBGui.C:75
 ForwardOADBGui.C:76
 ForwardOADBGui.C:77
 ForwardOADBGui.C:78
 ForwardOADBGui.C:79
 ForwardOADBGui.C:80
 ForwardOADBGui.C:81
 ForwardOADBGui.C:82
 ForwardOADBGui.C:83
 ForwardOADBGui.C:84
 ForwardOADBGui.C:85
 ForwardOADBGui.C:86
 ForwardOADBGui.C:87
 ForwardOADBGui.C:88
 ForwardOADBGui.C:89
 ForwardOADBGui.C:90
 ForwardOADBGui.C:91
 ForwardOADBGui.C:92
 ForwardOADBGui.C:93
 ForwardOADBGui.C:94
 ForwardOADBGui.C:95
 ForwardOADBGui.C:96
 ForwardOADBGui.C:97
 ForwardOADBGui.C:98
 ForwardOADBGui.C:99
 ForwardOADBGui.C:100
 ForwardOADBGui.C:101
 ForwardOADBGui.C:102
 ForwardOADBGui.C:103
 ForwardOADBGui.C:104
 ForwardOADBGui.C:105
 ForwardOADBGui.C:106
 ForwardOADBGui.C:107
 ForwardOADBGui.C:108
 ForwardOADBGui.C:109
 ForwardOADBGui.C:110
 ForwardOADBGui.C:111
 ForwardOADBGui.C:112
 ForwardOADBGui.C:113
 ForwardOADBGui.C:114
 ForwardOADBGui.C:115
 ForwardOADBGui.C:116
 ForwardOADBGui.C:117
 ForwardOADBGui.C:118
 ForwardOADBGui.C:119
 ForwardOADBGui.C:120
 ForwardOADBGui.C:121
 ForwardOADBGui.C:122
 ForwardOADBGui.C:123
 ForwardOADBGui.C:124
 ForwardOADBGui.C:125
 ForwardOADBGui.C:126
 ForwardOADBGui.C:127
 ForwardOADBGui.C:128
 ForwardOADBGui.C:129
 ForwardOADBGui.C:130
 ForwardOADBGui.C:131
 ForwardOADBGui.C:132
 ForwardOADBGui.C:133
 ForwardOADBGui.C:134
 ForwardOADBGui.C:135
 ForwardOADBGui.C:136
 ForwardOADBGui.C:137
 ForwardOADBGui.C:138
 ForwardOADBGui.C:139
 ForwardOADBGui.C:140
 ForwardOADBGui.C:141
 ForwardOADBGui.C:142
 ForwardOADBGui.C:143
 ForwardOADBGui.C:144
 ForwardOADBGui.C:145
 ForwardOADBGui.C:146
 ForwardOADBGui.C:147
 ForwardOADBGui.C:148
 ForwardOADBGui.C:149
 ForwardOADBGui.C:150
 ForwardOADBGui.C:151
 ForwardOADBGui.C:152
 ForwardOADBGui.C:153
 ForwardOADBGui.C:154
 ForwardOADBGui.C:155
 ForwardOADBGui.C:156
 ForwardOADBGui.C:157
 ForwardOADBGui.C:158
 ForwardOADBGui.C:159
 ForwardOADBGui.C:160
 ForwardOADBGui.C:161
 ForwardOADBGui.C:162
 ForwardOADBGui.C:163
 ForwardOADBGui.C:164
 ForwardOADBGui.C:165
 ForwardOADBGui.C:166
 ForwardOADBGui.C:167
 ForwardOADBGui.C:168
 ForwardOADBGui.C:169
 ForwardOADBGui.C:170
 ForwardOADBGui.C:171
 ForwardOADBGui.C:172
 ForwardOADBGui.C:173
 ForwardOADBGui.C:174
 ForwardOADBGui.C:175
 ForwardOADBGui.C:176
 ForwardOADBGui.C:177
 ForwardOADBGui.C:178
 ForwardOADBGui.C:179
 ForwardOADBGui.C:180
 ForwardOADBGui.C:181
 ForwardOADBGui.C:182
 ForwardOADBGui.C:183
 ForwardOADBGui.C:184
 ForwardOADBGui.C:185
 ForwardOADBGui.C:186
 ForwardOADBGui.C:187
 ForwardOADBGui.C:188
 ForwardOADBGui.C:189
 ForwardOADBGui.C:190
 ForwardOADBGui.C:191
 ForwardOADBGui.C:192
 ForwardOADBGui.C:193
 ForwardOADBGui.C:194
 ForwardOADBGui.C:195
 ForwardOADBGui.C:196
 ForwardOADBGui.C:197
 ForwardOADBGui.C:198
 ForwardOADBGui.C:199
 ForwardOADBGui.C:200
 ForwardOADBGui.C:201
 ForwardOADBGui.C:202
 ForwardOADBGui.C:203
 ForwardOADBGui.C:204
 ForwardOADBGui.C:205
 ForwardOADBGui.C:206
 ForwardOADBGui.C:207
 ForwardOADBGui.C:208
 ForwardOADBGui.C:209
 ForwardOADBGui.C:210
 ForwardOADBGui.C:211
 ForwardOADBGui.C:212
 ForwardOADBGui.C:213
 ForwardOADBGui.C:214
 ForwardOADBGui.C:215
 ForwardOADBGui.C:216
 ForwardOADBGui.C:217
 ForwardOADBGui.C:218
 ForwardOADBGui.C:219
 ForwardOADBGui.C:220
 ForwardOADBGui.C:221
 ForwardOADBGui.C:222
 ForwardOADBGui.C:223
 ForwardOADBGui.C:224
 ForwardOADBGui.C:225
 ForwardOADBGui.C:226
 ForwardOADBGui.C:227
 ForwardOADBGui.C:228
 ForwardOADBGui.C:229
 ForwardOADBGui.C:230
 ForwardOADBGui.C:231
 ForwardOADBGui.C:232
 ForwardOADBGui.C:233
 ForwardOADBGui.C:234
 ForwardOADBGui.C:235
 ForwardOADBGui.C:236
 ForwardOADBGui.C:237
 ForwardOADBGui.C:238
 ForwardOADBGui.C:239
 ForwardOADBGui.C:240
 ForwardOADBGui.C:241
 ForwardOADBGui.C:242
 ForwardOADBGui.C:243
 ForwardOADBGui.C:244
 ForwardOADBGui.C:245
 ForwardOADBGui.C:246
 ForwardOADBGui.C:247
 ForwardOADBGui.C:248
 ForwardOADBGui.C:249
 ForwardOADBGui.C:250
 ForwardOADBGui.C:251
 ForwardOADBGui.C:252
 ForwardOADBGui.C:253
 ForwardOADBGui.C:254
 ForwardOADBGui.C:255
 ForwardOADBGui.C:256
 ForwardOADBGui.C:257
 ForwardOADBGui.C:258
 ForwardOADBGui.C:259
 ForwardOADBGui.C:260
 ForwardOADBGui.C:261
 ForwardOADBGui.C:262
 ForwardOADBGui.C:263
 ForwardOADBGui.C:264
 ForwardOADBGui.C:265
 ForwardOADBGui.C:266
 ForwardOADBGui.C:267
 ForwardOADBGui.C:268
 ForwardOADBGui.C:269
 ForwardOADBGui.C:270
 ForwardOADBGui.C:271
 ForwardOADBGui.C:272
 ForwardOADBGui.C:273
 ForwardOADBGui.C:274
 ForwardOADBGui.C:275
 ForwardOADBGui.C:276
 ForwardOADBGui.C:277
 ForwardOADBGui.C:278
 ForwardOADBGui.C:279
 ForwardOADBGui.C:280
 ForwardOADBGui.C:281
 ForwardOADBGui.C:282
 ForwardOADBGui.C:283
 ForwardOADBGui.C:284
 ForwardOADBGui.C:285
 ForwardOADBGui.C:286
 ForwardOADBGui.C:287
 ForwardOADBGui.C:288
 ForwardOADBGui.C:289
 ForwardOADBGui.C:290
 ForwardOADBGui.C:291
 ForwardOADBGui.C:292
 ForwardOADBGui.C:293
 ForwardOADBGui.C:294
 ForwardOADBGui.C:295
 ForwardOADBGui.C:296
 ForwardOADBGui.C:297
 ForwardOADBGui.C:298
 ForwardOADBGui.C:299
 ForwardOADBGui.C:300
 ForwardOADBGui.C:301
 ForwardOADBGui.C:302
 ForwardOADBGui.C:303
 ForwardOADBGui.C:304
 ForwardOADBGui.C:305
 ForwardOADBGui.C:306
 ForwardOADBGui.C:307
 ForwardOADBGui.C:308
 ForwardOADBGui.C:309
 ForwardOADBGui.C:310
 ForwardOADBGui.C:311
 ForwardOADBGui.C:312
 ForwardOADBGui.C:313
 ForwardOADBGui.C:314
 ForwardOADBGui.C:315
 ForwardOADBGui.C:316
 ForwardOADBGui.C:317
 ForwardOADBGui.C:318
 ForwardOADBGui.C:319
 ForwardOADBGui.C:320
 ForwardOADBGui.C:321
 ForwardOADBGui.C:322
 ForwardOADBGui.C:323
 ForwardOADBGui.C:324
 ForwardOADBGui.C:325
 ForwardOADBGui.C:326
 ForwardOADBGui.C:327
 ForwardOADBGui.C:328
 ForwardOADBGui.C:329
 ForwardOADBGui.C:330
 ForwardOADBGui.C:331
 ForwardOADBGui.C:332
 ForwardOADBGui.C:333
 ForwardOADBGui.C:334
 ForwardOADBGui.C:335
 ForwardOADBGui.C:336
 ForwardOADBGui.C:337
 ForwardOADBGui.C:338
 ForwardOADBGui.C:339
 ForwardOADBGui.C:340
 ForwardOADBGui.C:341
 ForwardOADBGui.C:342
 ForwardOADBGui.C:343
 ForwardOADBGui.C:344
 ForwardOADBGui.C:345
 ForwardOADBGui.C:346
 ForwardOADBGui.C:347
 ForwardOADBGui.C:348
 ForwardOADBGui.C:349
 ForwardOADBGui.C:350
 ForwardOADBGui.C:351
 ForwardOADBGui.C:352
 ForwardOADBGui.C:353
 ForwardOADBGui.C:354
 ForwardOADBGui.C:355
 ForwardOADBGui.C:356
 ForwardOADBGui.C:357
 ForwardOADBGui.C:358
 ForwardOADBGui.C:359
 ForwardOADBGui.C:360
 ForwardOADBGui.C:361
 ForwardOADBGui.C:362
 ForwardOADBGui.C:363
 ForwardOADBGui.C:364
 ForwardOADBGui.C:365
 ForwardOADBGui.C:366
 ForwardOADBGui.C:367
 ForwardOADBGui.C:368
 ForwardOADBGui.C:369
 ForwardOADBGui.C:370
 ForwardOADBGui.C:371
 ForwardOADBGui.C:372
 ForwardOADBGui.C:373
 ForwardOADBGui.C:374
 ForwardOADBGui.C:375
 ForwardOADBGui.C:376
 ForwardOADBGui.C:377
 ForwardOADBGui.C:378
 ForwardOADBGui.C:379
 ForwardOADBGui.C:380
 ForwardOADBGui.C:381
 ForwardOADBGui.C:382
 ForwardOADBGui.C:383
 ForwardOADBGui.C:384
 ForwardOADBGui.C:385
 ForwardOADBGui.C:386
 ForwardOADBGui.C:387
 ForwardOADBGui.C:388
 ForwardOADBGui.C:389
 ForwardOADBGui.C:390
 ForwardOADBGui.C:391
 ForwardOADBGui.C:392
 ForwardOADBGui.C:393
 ForwardOADBGui.C:394
 ForwardOADBGui.C:395
 ForwardOADBGui.C:396
 ForwardOADBGui.C:397
 ForwardOADBGui.C:398
 ForwardOADBGui.C:399
 ForwardOADBGui.C:400
 ForwardOADBGui.C:401
 ForwardOADBGui.C:402
 ForwardOADBGui.C:403
 ForwardOADBGui.C:404
 ForwardOADBGui.C:405
 ForwardOADBGui.C:406
 ForwardOADBGui.C:407
 ForwardOADBGui.C:408
 ForwardOADBGui.C:409
 ForwardOADBGui.C:410
 ForwardOADBGui.C:411
 ForwardOADBGui.C:412
 ForwardOADBGui.C:413
 ForwardOADBGui.C:414
 ForwardOADBGui.C:415
 ForwardOADBGui.C:416
 ForwardOADBGui.C:417
 ForwardOADBGui.C:418
 ForwardOADBGui.C:419
 ForwardOADBGui.C:420
 ForwardOADBGui.C:421
 ForwardOADBGui.C:422
 ForwardOADBGui.C:423
 ForwardOADBGui.C:424
 ForwardOADBGui.C:425
 ForwardOADBGui.C:426
 ForwardOADBGui.C:427
 ForwardOADBGui.C:428
 ForwardOADBGui.C:429
 ForwardOADBGui.C:430
 ForwardOADBGui.C:431
 ForwardOADBGui.C:432
 ForwardOADBGui.C:433
 ForwardOADBGui.C:434
 ForwardOADBGui.C:435
 ForwardOADBGui.C:436
 ForwardOADBGui.C:437
 ForwardOADBGui.C:438
 ForwardOADBGui.C:439
 ForwardOADBGui.C:440
 ForwardOADBGui.C:441
 ForwardOADBGui.C:442
 ForwardOADBGui.C:443
 ForwardOADBGui.C:444
 ForwardOADBGui.C:445
 ForwardOADBGui.C:446
 ForwardOADBGui.C:447
 ForwardOADBGui.C:448
 ForwardOADBGui.C:449
 ForwardOADBGui.C:450
 ForwardOADBGui.C:451
 ForwardOADBGui.C:452
 ForwardOADBGui.C:453
 ForwardOADBGui.C:454
 ForwardOADBGui.C:455
 ForwardOADBGui.C:456
 ForwardOADBGui.C:457
 ForwardOADBGui.C:458
 ForwardOADBGui.C:459
 ForwardOADBGui.C:460
 ForwardOADBGui.C:461
 ForwardOADBGui.C:462
 ForwardOADBGui.C:463
 ForwardOADBGui.C:464
 ForwardOADBGui.C:465
 ForwardOADBGui.C:466
 ForwardOADBGui.C:467
 ForwardOADBGui.C:468
 ForwardOADBGui.C:469
 ForwardOADBGui.C:470
 ForwardOADBGui.C:471
 ForwardOADBGui.C:472
 ForwardOADBGui.C:473
 ForwardOADBGui.C:474
 ForwardOADBGui.C:475
 ForwardOADBGui.C:476
 ForwardOADBGui.C:477
 ForwardOADBGui.C:478
 ForwardOADBGui.C:479
 ForwardOADBGui.C:480
 ForwardOADBGui.C:481
 ForwardOADBGui.C:482
 ForwardOADBGui.C:483
 ForwardOADBGui.C:484
 ForwardOADBGui.C:485
 ForwardOADBGui.C:486
 ForwardOADBGui.C:487
 ForwardOADBGui.C:488
 ForwardOADBGui.C:489
 ForwardOADBGui.C:490
 ForwardOADBGui.C:491
 ForwardOADBGui.C:492
 ForwardOADBGui.C:493
 ForwardOADBGui.C:494
 ForwardOADBGui.C:495
 ForwardOADBGui.C:496
 ForwardOADBGui.C:497
 ForwardOADBGui.C:498
 ForwardOADBGui.C:499
 ForwardOADBGui.C:500
 ForwardOADBGui.C:501
 ForwardOADBGui.C:502
 ForwardOADBGui.C:503
 ForwardOADBGui.C:504
 ForwardOADBGui.C:505
 ForwardOADBGui.C:506
 ForwardOADBGui.C:507
 ForwardOADBGui.C:508
 ForwardOADBGui.C:509
 ForwardOADBGui.C:510
 ForwardOADBGui.C:511
 ForwardOADBGui.C:512
 ForwardOADBGui.C:513
 ForwardOADBGui.C:514
 ForwardOADBGui.C:515
 ForwardOADBGui.C:516
 ForwardOADBGui.C:517
 ForwardOADBGui.C:518
 ForwardOADBGui.C:519
 ForwardOADBGui.C:520
 ForwardOADBGui.C:521
 ForwardOADBGui.C:522
 ForwardOADBGui.C:523
 ForwardOADBGui.C:524
 ForwardOADBGui.C:525
 ForwardOADBGui.C:526
 ForwardOADBGui.C:527
 ForwardOADBGui.C:528
 ForwardOADBGui.C:529
 ForwardOADBGui.C:530
 ForwardOADBGui.C:531
 ForwardOADBGui.C:532
 ForwardOADBGui.C:533
 ForwardOADBGui.C:534
 ForwardOADBGui.C:535
 ForwardOADBGui.C:536
 ForwardOADBGui.C:537
 ForwardOADBGui.C:538
 ForwardOADBGui.C:539
 ForwardOADBGui.C:540
 ForwardOADBGui.C:541
 ForwardOADBGui.C:542
 ForwardOADBGui.C:543
 ForwardOADBGui.C:544
 ForwardOADBGui.C:545
 ForwardOADBGui.C:546
 ForwardOADBGui.C:547
 ForwardOADBGui.C:548
 ForwardOADBGui.C:549
 ForwardOADBGui.C:550
 ForwardOADBGui.C:551
 ForwardOADBGui.C:552
 ForwardOADBGui.C:553
 ForwardOADBGui.C:554
 ForwardOADBGui.C:555
 ForwardOADBGui.C:556
 ForwardOADBGui.C:557
 ForwardOADBGui.C:558
 ForwardOADBGui.C:559
 ForwardOADBGui.C:560
 ForwardOADBGui.C:561
 ForwardOADBGui.C:562
 ForwardOADBGui.C:563
 ForwardOADBGui.C:564
 ForwardOADBGui.C:565
 ForwardOADBGui.C:566
 ForwardOADBGui.C:567
 ForwardOADBGui.C:568
 ForwardOADBGui.C:569
 ForwardOADBGui.C:570
 ForwardOADBGui.C:571
 ForwardOADBGui.C:572
 ForwardOADBGui.C:573
 ForwardOADBGui.C:574
 ForwardOADBGui.C:575
 ForwardOADBGui.C:576
 ForwardOADBGui.C:577
 ForwardOADBGui.C:578
 ForwardOADBGui.C:579
 ForwardOADBGui.C:580
 ForwardOADBGui.C:581
 ForwardOADBGui.C:582
 ForwardOADBGui.C:583
 ForwardOADBGui.C:584
 ForwardOADBGui.C:585
 ForwardOADBGui.C:586
 ForwardOADBGui.C:587
 ForwardOADBGui.C:588
 ForwardOADBGui.C:589
 ForwardOADBGui.C:590
 ForwardOADBGui.C:591
 ForwardOADBGui.C:592
 ForwardOADBGui.C:593
 ForwardOADBGui.C:594
 ForwardOADBGui.C:595
 ForwardOADBGui.C:596
 ForwardOADBGui.C:597
 ForwardOADBGui.C:598
 ForwardOADBGui.C:599
 ForwardOADBGui.C:600
 ForwardOADBGui.C:601
 ForwardOADBGui.C:602
 ForwardOADBGui.C:603
 ForwardOADBGui.C:604
 ForwardOADBGui.C:605
 ForwardOADBGui.C:606
 ForwardOADBGui.C:607
 ForwardOADBGui.C:608
 ForwardOADBGui.C:609
 ForwardOADBGui.C:610
 ForwardOADBGui.C:611
 ForwardOADBGui.C:612
 ForwardOADBGui.C:613
 ForwardOADBGui.C:614
 ForwardOADBGui.C:615
 ForwardOADBGui.C:616
 ForwardOADBGui.C:617
 ForwardOADBGui.C:618
 ForwardOADBGui.C:619
 ForwardOADBGui.C:620
 ForwardOADBGui.C:621
 ForwardOADBGui.C:622
 ForwardOADBGui.C:623
 ForwardOADBGui.C:624
 ForwardOADBGui.C:625
 ForwardOADBGui.C:626
 ForwardOADBGui.C:627
 ForwardOADBGui.C:628
 ForwardOADBGui.C:629
 ForwardOADBGui.C:630
 ForwardOADBGui.C:631
 ForwardOADBGui.C:632
 ForwardOADBGui.C:633
 ForwardOADBGui.C:634
 ForwardOADBGui.C:635
 ForwardOADBGui.C:636
 ForwardOADBGui.C:637
 ForwardOADBGui.C:638
 ForwardOADBGui.C:639
 ForwardOADBGui.C:640
 ForwardOADBGui.C:641
 ForwardOADBGui.C:642
 ForwardOADBGui.C:643
 ForwardOADBGui.C:644
 ForwardOADBGui.C:645
 ForwardOADBGui.C:646
 ForwardOADBGui.C:647
 ForwardOADBGui.C:648
 ForwardOADBGui.C:649
 ForwardOADBGui.C:650
 ForwardOADBGui.C:651
 ForwardOADBGui.C:652
 ForwardOADBGui.C:653
 ForwardOADBGui.C:654
 ForwardOADBGui.C:655
 ForwardOADBGui.C:656
 ForwardOADBGui.C:657
 ForwardOADBGui.C:658
 ForwardOADBGui.C:659
 ForwardOADBGui.C:660
 ForwardOADBGui.C:661
 ForwardOADBGui.C:662
 ForwardOADBGui.C:663
 ForwardOADBGui.C:664
 ForwardOADBGui.C:665
 ForwardOADBGui.C:666
 ForwardOADBGui.C:667
 ForwardOADBGui.C:668
 ForwardOADBGui.C:669
 ForwardOADBGui.C:670
 ForwardOADBGui.C:671
 ForwardOADBGui.C:672
 ForwardOADBGui.C:673
 ForwardOADBGui.C:674
 ForwardOADBGui.C:675
 ForwardOADBGui.C:676
 ForwardOADBGui.C:677
 ForwardOADBGui.C:678
 ForwardOADBGui.C:679
 ForwardOADBGui.C:680
 ForwardOADBGui.C:681
 ForwardOADBGui.C:682
 ForwardOADBGui.C:683
 ForwardOADBGui.C:684
 ForwardOADBGui.C:685
 ForwardOADBGui.C:686
 ForwardOADBGui.C:687
 ForwardOADBGui.C:688
 ForwardOADBGui.C:689
 ForwardOADBGui.C:690
 ForwardOADBGui.C:691
 ForwardOADBGui.C:692
 ForwardOADBGui.C:693
 ForwardOADBGui.C:694
 ForwardOADBGui.C:695
 ForwardOADBGui.C:696
 ForwardOADBGui.C:697
 ForwardOADBGui.C:698
 ForwardOADBGui.C:699
 ForwardOADBGui.C:700
 ForwardOADBGui.C:701
 ForwardOADBGui.C:702
 ForwardOADBGui.C:703
 ForwardOADBGui.C:704
 ForwardOADBGui.C:705
 ForwardOADBGui.C:706
 ForwardOADBGui.C:707
 ForwardOADBGui.C:708
 ForwardOADBGui.C:709
 ForwardOADBGui.C:710
 ForwardOADBGui.C:711
 ForwardOADBGui.C:712
 ForwardOADBGui.C:713
 ForwardOADBGui.C:714
 ForwardOADBGui.C:715
 ForwardOADBGui.C:716
 ForwardOADBGui.C:717
 ForwardOADBGui.C:718
 ForwardOADBGui.C:719
 ForwardOADBGui.C:720
 ForwardOADBGui.C:721
 ForwardOADBGui.C:722
 ForwardOADBGui.C:723
 ForwardOADBGui.C:724
 ForwardOADBGui.C:725
 ForwardOADBGui.C:726
 ForwardOADBGui.C:727
 ForwardOADBGui.C:728
 ForwardOADBGui.C:729
 ForwardOADBGui.C:730
 ForwardOADBGui.C:731
 ForwardOADBGui.C:732
 ForwardOADBGui.C:733
 ForwardOADBGui.C:734
 ForwardOADBGui.C:735
 ForwardOADBGui.C:736
 ForwardOADBGui.C:737
 ForwardOADBGui.C:738
 ForwardOADBGui.C:739
 ForwardOADBGui.C:740
 ForwardOADBGui.C:741
 ForwardOADBGui.C:742
 ForwardOADBGui.C:743
 ForwardOADBGui.C:744
 ForwardOADBGui.C:745
 ForwardOADBGui.C:746
 ForwardOADBGui.C:747
 ForwardOADBGui.C:748
 ForwardOADBGui.C:749
 ForwardOADBGui.C:750
 ForwardOADBGui.C:751
 ForwardOADBGui.C:752
 ForwardOADBGui.C:753
 ForwardOADBGui.C:754
 ForwardOADBGui.C:755
 ForwardOADBGui.C:756
 ForwardOADBGui.C:757
 ForwardOADBGui.C:758
 ForwardOADBGui.C:759
 ForwardOADBGui.C:760
 ForwardOADBGui.C:761
 ForwardOADBGui.C:762
 ForwardOADBGui.C:763
 ForwardOADBGui.C:764
 ForwardOADBGui.C:765
 ForwardOADBGui.C:766
 ForwardOADBGui.C:767
 ForwardOADBGui.C:768
 ForwardOADBGui.C:769
 ForwardOADBGui.C:770
 ForwardOADBGui.C:771
 ForwardOADBGui.C:772
 ForwardOADBGui.C:773
 ForwardOADBGui.C:774
 ForwardOADBGui.C:775
 ForwardOADBGui.C:776
 ForwardOADBGui.C:777
 ForwardOADBGui.C:778
 ForwardOADBGui.C:779
 ForwardOADBGui.C:780
 ForwardOADBGui.C:781
 ForwardOADBGui.C:782
 ForwardOADBGui.C:783
 ForwardOADBGui.C:784
 ForwardOADBGui.C:785
 ForwardOADBGui.C:786
 ForwardOADBGui.C:787
 ForwardOADBGui.C:788
 ForwardOADBGui.C:789
 ForwardOADBGui.C:790
 ForwardOADBGui.C:791
 ForwardOADBGui.C:792
 ForwardOADBGui.C:793
 ForwardOADBGui.C:794
 ForwardOADBGui.C:795
 ForwardOADBGui.C:796
 ForwardOADBGui.C:797
 ForwardOADBGui.C:798
 ForwardOADBGui.C:799
 ForwardOADBGui.C:800
 ForwardOADBGui.C:801
 ForwardOADBGui.C:802
 ForwardOADBGui.C:803
 ForwardOADBGui.C:804
 ForwardOADBGui.C:805
 ForwardOADBGui.C:806
 ForwardOADBGui.C:807
 ForwardOADBGui.C:808
 ForwardOADBGui.C:809
 ForwardOADBGui.C:810
 ForwardOADBGui.C:811
 ForwardOADBGui.C:812
 ForwardOADBGui.C:813
 ForwardOADBGui.C:814
 ForwardOADBGui.C:815
 ForwardOADBGui.C:816
 ForwardOADBGui.C:817
 ForwardOADBGui.C:818
 ForwardOADBGui.C:819
 ForwardOADBGui.C:820
 ForwardOADBGui.C:821
 ForwardOADBGui.C:822
 ForwardOADBGui.C:823
 ForwardOADBGui.C:824
 ForwardOADBGui.C:825
 ForwardOADBGui.C:826
 ForwardOADBGui.C:827
 ForwardOADBGui.C:828
 ForwardOADBGui.C:829
 ForwardOADBGui.C:830
 ForwardOADBGui.C:831
 ForwardOADBGui.C:832
 ForwardOADBGui.C:833
 ForwardOADBGui.C:834
 ForwardOADBGui.C:835
 ForwardOADBGui.C:836
 ForwardOADBGui.C:837
 ForwardOADBGui.C:838
 ForwardOADBGui.C:839
 ForwardOADBGui.C:840
 ForwardOADBGui.C:841
 ForwardOADBGui.C:842
 ForwardOADBGui.C:843
 ForwardOADBGui.C:844
 ForwardOADBGui.C:845
 ForwardOADBGui.C:846
 ForwardOADBGui.C:847
 ForwardOADBGui.C:848
 ForwardOADBGui.C:849
 ForwardOADBGui.C:850
 ForwardOADBGui.C:851
 ForwardOADBGui.C:852
 ForwardOADBGui.C:853
 ForwardOADBGui.C:854
 ForwardOADBGui.C:855
 ForwardOADBGui.C:856
 ForwardOADBGui.C:857
 ForwardOADBGui.C:858
 ForwardOADBGui.C:859
 ForwardOADBGui.C:860
 ForwardOADBGui.C:861
 ForwardOADBGui.C:862
 ForwardOADBGui.C:863
 ForwardOADBGui.C:864
 ForwardOADBGui.C:865
 ForwardOADBGui.C:866
 ForwardOADBGui.C:867
 ForwardOADBGui.C:868
 ForwardOADBGui.C:869
 ForwardOADBGui.C:870
 ForwardOADBGui.C:871
 ForwardOADBGui.C:872
 ForwardOADBGui.C:873
 ForwardOADBGui.C:874
 ForwardOADBGui.C:875
 ForwardOADBGui.C:876
 ForwardOADBGui.C:877
 ForwardOADBGui.C:878
 ForwardOADBGui.C:879
 ForwardOADBGui.C:880
 ForwardOADBGui.C:881
 ForwardOADBGui.C:882
 ForwardOADBGui.C:883
 ForwardOADBGui.C:884
 ForwardOADBGui.C:885
 ForwardOADBGui.C:886
 ForwardOADBGui.C:887
 ForwardOADBGui.C:888
 ForwardOADBGui.C:889
 ForwardOADBGui.C:890
 ForwardOADBGui.C:891
 ForwardOADBGui.C:892
 ForwardOADBGui.C:893
 ForwardOADBGui.C:894
 ForwardOADBGui.C:895
 ForwardOADBGui.C:896
 ForwardOADBGui.C:897
 ForwardOADBGui.C:898
 ForwardOADBGui.C:899
 ForwardOADBGui.C:900
 ForwardOADBGui.C:901
 ForwardOADBGui.C:902
 ForwardOADBGui.C:903
 ForwardOADBGui.C:904
 ForwardOADBGui.C:905
 ForwardOADBGui.C:906