ROOT logo
// @(#)root/eve:$Id: SplitGLView.C 28380 2009-04-29 07:19:13Z bellenot $
// Author: Bertrand Bellenot

// Helper classes for the alice_esd_split.C demo.

#include "TApplication.h"
#include "TSystem.h"
#include "TGFrame.h"
#include "TGLayout.h"
#include "TGSplitter.h"
#include "TGLWidget.h"
#include "TEvePad.h"
#include "TGeoManager.h"
#include "TString.h"
#include "TGMenu.h"
#include "TGStatusBar.h"
#include "TGFileDialog.h"
#include "TGMsgBox.h"
#include "TGLPhysicalShape.h"
#include "TGLLogicalShape.h"
#include "HelpText.h"
#include "TClass.h"
#include "Riostream.h"
#include "TEnv.h"
#include "TGListTree.h"
#include "TOrdCollection.h"
#include "TArrayF.h"
#include "TGHtml.h"
#include "TPRegexp.h"

#include "TEveManager.h"
#include "TEveViewer.h"
#include "TEveBrowser.h"
#include "TEveProjectionManager.h"
#include "TEveProjectionAxes.h"
#include "TEveScene.h"
#include "TEveGeoNode.h"
#include "TEveEventManager.h"
#include "TEveTrack.h"
#include "TEveSelection.h"

#include "TRootEmbeddedCanvas.h"
#include "TGSplitFrame.h"
#include "TGLOverlayButton.h"
#include "TGLEmbeddedViewer.h"
#include "TGDockableFrame.h"
#include "TGShapedFrame.h"
#include "TGButton.h"
#include "TGTab.h"
#include "TEnv.h"

#include "TCanvas.h"
#include "TFormula.h"
#include "TF1.h"
#include "TH1F.h"

#ifdef WIN32
#include <TWin32SplashThread.h>
#endif

const char *filetypes[] = { 
   "ROOT files",    "*.root",
   "All files",     "*",
   0,               0 
};

const char *rcfiletypes[] = { 
   "All files",     "*",
   0,               0 
};

////////////////////////////////////////////////////////////////////////////////
class TGShapedToolTip : public TGShapedFrame {

private:
   TGShapedToolTip(const TGShapedToolTip&); // Not implemented
   TGShapedToolTip& operator=(const TGShapedToolTip&); // Not implemented

protected:
   Int_t                 fTextX, fTextY, fTextH;
   TString               fTextCol;

   TRootEmbeddedCanvas  *fEc;       // embedded canvas for histogram
   TH1                  *fHist;     // user histogram
   TString               fText;     // info (as tool tip) text

   virtual void          DoRedraw() {}

public:
   TGShapedToolTip(const char *picname, Int_t cx=0, Int_t cy=0, Int_t cw=0, 
                   Int_t ch=0, Int_t tx=0, Int_t ty=0, Int_t th=0, 
                   const char *col="#ffffff");
   virtual ~TGShapedToolTip();

   virtual void   CloseWindow();
   void           CreateCanvas(Int_t cx, Int_t cy, Int_t cw, Int_t ch);
   void           CreateCanvas(Int_t cw, Int_t ch, TGLayoutHints *hints);
   TH1           *GetHisto() const { return fHist; }
   const char    *GetText() const { return fText.Data(); }
   void           Refresh();
   void           SetHisto(TH1 *hist);
   void           SetText(const char *text);
   void           SetTextColor(const char *col);
   void           SetTextAttributes(Int_t tx, Int_t ty, Int_t th, const char *col=0);
   void           Show(Int_t x, Int_t y, const char *text = 0, TH1 *hist = 0);

   ClassDef(TGShapedToolTip, 0) // Shaped composite frame
};

////////////////////////////////////////////////////////////////////////////////
class HtmlObjTable : public TObject {
public:                     // make them public for shorter code

   TString   fName;
   Int_t     fNValues;      // number of values
   Int_t     fNFields;      // number of fields
   TArrayF  *fValues;
   TString  *fLabels;
   Bool_t    fExpand;

   TString   fHtml;         // HTML output code

   void Build();
   void BuildTitle();
   void BuildLabels();
   void BuildTable();

public:
   HtmlObjTable(const char *name, Int_t nfields, Int_t nvals, Bool_t exp=kTRUE);
   virtual ~HtmlObjTable();

   void     SetLabel(Int_t col, const char *label) { fLabels[col] = label; }
   void     SetValue(Int_t col, Int_t row, Float_t val) { fValues[col].SetAt(val, row); }
   TString  Html() const { return fHtml; }

   ClassDef(HtmlObjTable, 0);
};

////////////////////////////////////////////////////////////////////////////////
class HtmlSummary {
public:                           // make them public for shorter code
   Int_t           fNTables;
   TOrdCollection *fObjTables;    // ->array of object tables
   TString         fHtml;         // output HTML string
   TString         fTitle;        // page title
   TString         fHeader;       // HTML header
   TString         fFooter;       // HTML footer

   void     MakeHeader();
   void     MakeFooter();

public:
   HtmlSummary(const char *title);
   virtual ~HtmlSummary();

   HtmlObjTable  *AddTable(const char *name, Int_t nfields, Int_t nvals, 
                           Bool_t exp=kTRUE, Option_t *opt="");
   HtmlObjTable  *GetTable(Int_t at) const { return (HtmlObjTable *)fObjTables->At(at); }
   void           Build();
   void           Clear(Option_t *option="");
   void           Reset(Option_t *option="");
   TString        Html() const { return fHtml; }

   ClassDef(HtmlSummary, 0);
};

////////////////////////////////////////////////////////////////////////////////
class SplitGLView : public TGMainFrame {

public:
   enum EMyCommands {
      kFileOpen, kFileExit, kFileLoadConfig, kFileSaveConfig,
      kHelpAbout, kGLPerspYOZ, kGLPerspXOZ, kGLPerspXOY, kGLXOY,
      kGLXOZ, kGLZOY, kGLOrthoRotate, kGLOrthoDolly, kSceneUpdate, 
      kSceneUpdateAll, kSummaryUpdate
   };

private:
   TEvePad               *fPad;           // pad used as geometry container
   TGSplitFrame          *fSplitFrame;    // main (first) split frame
   TGLEmbeddedViewer     *fViewer0;       // main GL viewer
   TGLEmbeddedViewer     *fViewer1;       // first GL viewer
   TGLEmbeddedViewer     *fViewer2;       // second GL viewer
   TGLEmbeddedViewer     *fActViewer;     // actual (active) GL viewer
   static HtmlSummary    *fgHtmlSummary;  // summary HTML table
   static TGHtml         *fgHtml;
   TGMenuBar             *fMenuBar;       // main menu bar
   TGPopupMenu           *fMenuFile;      // 'File' popup menu
   TGPopupMenu           *fMenuHelp;      // 'Help' popup menu
   TGPopupMenu           *fMenuCamera;    // 'Camera' popup menu
   TGPopupMenu           *fMenuScene;     // 'Scene' popup menu
   TGStatusBar           *fStatusBar;     // status bar
   TGShapedToolTip       *fShapedToolTip; // shaped tooltip
   Bool_t                 fIsEmbedded;

   TEveViewer            *fViewer[3];
   TEveProjectionManager *fRPhiMgr;
   TEveProjectionManager *fRhoZMgr;

public:
   SplitGLView(const TGWindow *p=0, UInt_t w=800, UInt_t h=600, Bool_t embed=kFALSE);
   virtual ~SplitGLView();

   void           ItemClicked(TGListTreeItem *item, Int_t btn, Int_t x, Int_t y);
   void           HandleMenu(Int_t id);
   void           OnClicked(TObject *obj);
   void           OnMouseIdle(TGLPhysicalShape *shape, UInt_t posx, UInt_t posy);
   void           OnMouseOver(TGLPhysicalShape *shape);
   void           OnViewerActivated();
   void           OpenFile(const char *fname);
   void           SwapToMainView(TGLViewerBase *viewer);
   void           ToggleOrthoRotate();
   void           ToggleOrthoDolly();
   void           UnDock(TGLViewerBase *viewer);
   void           LoadConfig(const char *fname);
   void           SaveConfig(const char *fname);
   static void    UpdateSummary();

   TEveProjectionManager *GetRPhiMgr() const { return fRPhiMgr; }
   TEveProjectionManager *GetRhoZMgr() const { return fRhoZMgr; }

   ClassDef(SplitGLView, 0)
};

TEveProjectionManager *gRPhiMgr = 0;
TEveProjectionManager *gRhoZMgr = 0;

ClassImp(TGShapedToolTip)
ClassImp(HtmlObjTable)
ClassImp(HtmlSummary)
ClassImp(SplitGLView)

HtmlSummary *SplitGLView::fgHtmlSummary = 0;
TGHtml *SplitGLView::fgHtml = 0;

//______________________________________________________________________________
TGShapedToolTip::TGShapedToolTip(const char *pname, Int_t cx, Int_t cy, Int_t cw, 
                             Int_t ch, Int_t tx, Int_t ty, Int_t th, 
                             const char *col) : 
   TGShapedFrame(pname, gClient->GetDefaultRoot(), 400, 300, kTempFrame | 
                 kHorizontalFrame), fEc(0), fHist(0)
{
   // Shaped window constructor

   fTextX = tx; fTextY = ty; fTextH = th;
   if (col)
      fTextCol = col;
   else
      fTextCol = "0x000000";

   // create the embedded canvas
   if ((cx > 0) && (cy > 0) && (cw > 0) && (ch > 0)) {
      Int_t lhRight  = fWidth-cx-cw;
      Int_t lhBottom = fHeight-cy-ch;
      fEc = new TRootEmbeddedCanvas("ec", this, cw, ch, 0);
      AddFrame(fEc, new TGLayoutHints(kLHintsTop | kLHintsLeft, cx, 
                                      lhRight, cy, lhBottom));
   }
   MapSubwindows();
   Resize();
   Resize(fBgnd->GetWidth(), fBgnd->GetHeight());
}

//______________________________________________________________________________
TGShapedToolTip::~TGShapedToolTip() 
{
   // Destructor.

   if (fHist)
      delete fHist;
   if (fEc)
      delete fEc;
}

//______________________________________________________________________________
void TGShapedToolTip::CloseWindow() 
{
   // Close shaped window.
   
   DeleteWindow();
}

//______________________________________________________________________________
void TGShapedToolTip::Refresh()
{
   // Redraw the window with current attributes.

   const char *str = fText.Data();
   char *string = strdup(str);
   Int_t nlines = 0, size = fTextH;
   TString fp = gEnv->GetValue("Root.TTFontPath", "");
   TString ar = fp + "/arial.ttf";
   char *s = strtok((char *)string, "\n");
   TImage *img = (TImage*)fImage->Clone("img");
   img->DrawText(fTextX, fTextY+(nlines*size), s, size, fTextCol, ar);
   while ((s = strtok(0, "\n"))) {
      nlines++;
      img->DrawText(fTextX, fTextY+(nlines*size), s, size, fTextCol, ar);
   }
   img->PaintImage(fId, 0, 0, 0, 0, 0, 0, "opaque");
   free(string);
   delete img;
   gVirtualX->Update();
}

//______________________________________________________________________________
void TGShapedToolTip::CreateCanvas(Int_t cx, Int_t cy, Int_t cw, Int_t ch)
{

   // create the embedded canvas
   Int_t lhRight  = fWidth-cx-cw;
   Int_t lhBottom = fHeight-cy-ch;
   fEc = new TRootEmbeddedCanvas("ec", this, cw, ch, 0);
   AddFrame(fEc, new TGLayoutHints(kLHintsTop | kLHintsLeft, cx, 
                                   lhRight, cy, lhBottom));
   MapSubwindows();
   Resize();
   Resize(fBgnd->GetWidth(), fBgnd->GetHeight());
   if (IsMapped()) {
      Refresh();
   }
}

//______________________________________________________________________________
void TGShapedToolTip::CreateCanvas(Int_t cw, Int_t ch, TGLayoutHints *hints)
{
   // Create the embedded canvas.

   fEc = new TRootEmbeddedCanvas("ec", this, cw, ch, 0);
   AddFrame(fEc, hints);
   MapSubwindows();
   Resize();
   Resize(fBgnd->GetWidth(), fBgnd->GetHeight());
   if (IsMapped()) {
      Refresh();
   }
}

//______________________________________________________________________________
void TGShapedToolTip::SetHisto(TH1 *hist)
{
   // Set which histogram has to be displayed in the embedded canvas.

   if (hist) {
      if (fHist) {
         delete fHist;
         if (fEc)
            fEc->GetCanvas()->Clear();
      }
      fHist = (TH1 *)hist->Clone();
      if (fEc) {
         fEc->GetCanvas()->SetBorderMode(0);
         fEc->GetCanvas()->SetFillColor(10);
         fEc->GetCanvas()->cd();
         fHist->Draw();
         fEc->GetCanvas()->Update();
      }
   }
}

//______________________________________________________________________________
void TGShapedToolTip::SetText(const char *text)
{
   // Set which text has to be displayed.

   if (text) {
      fText = text;
   }
   if (IsMapped())
      Refresh();
}

//______________________________________________________________________________
void TGShapedToolTip::SetTextColor(const char *col)
{
   // Set text color.

   fTextCol = col;
   if (IsMapped())
      Refresh();
}

//______________________________________________________________________________
void TGShapedToolTip::SetTextAttributes(Int_t tx, Int_t ty, Int_t th, 
                                        const char *col)
{
   // Set text attributes (position, size and color).

   fTextX = tx; fTextY = ty; fTextH = th;
   if (col)
      fTextCol = col;
   if (IsMapped())
      Refresh();
}

//______________________________________________________________________________
void TGShapedToolTip::Show(Int_t x, Int_t y, const char *text, TH1 *hist)
{
   // Show (popup) the shaped window at location x,y and possibly
   // set the text and histogram to be displayed.

   Move(x, y);
   MapWindow();

   if (text)
      SetText(text);
   if (hist)
      SetHisto(hist);
   // end of demo code -------------------------------------------
   if (fHist) {
      fEc->GetCanvas()->SetBorderMode(0);
      fEc->GetCanvas()->SetFillColor(10);
      fEc->GetCanvas()->cd();
      fHist->Draw();
      fEc->GetCanvas()->Update();
   }
   Refresh();
}

//______________________________________________________________________________
HtmlObjTable::HtmlObjTable(const char *name, Int_t nfields, Int_t nvals, Bool_t exp) : 
   fName(name), fNValues(nvals), fNFields(nfields), fExpand(exp)
{
   // Constructor.

   fValues = new TArrayF[fNFields];
   for (int i=0;i<fNFields;i++)
      fValues[i].Set(nvals);
   fLabels = new TString[fNFields];
}

//______________________________________________________________________________
HtmlObjTable::~HtmlObjTable()
{
   // Destructor.

   delete [] fValues;
   delete [] fLabels;
}

//______________________________________________________________________________
void HtmlObjTable::Build()
{
   // Build HTML code.

   fHtml = "<table width=100% border=1 cellspacing=0 cellpadding=0 bgcolor=f0f0f0> ",

   BuildTitle();
   if (fExpand && (fNFields > 0) && (fNValues > 0)) {
      BuildLabels();
      BuildTable();
   }

   fHtml += "</table>";
}

//______________________________________________________________________________
void HtmlObjTable::BuildTitle()
{
   // Build table title.
   
   fHtml += "<tr><td colspan=";
   fHtml += Form("%d>", fNFields+1);
   fHtml += "<table width=100% border=0 cellspacing=2 cellpadding=0 bgcolor=6e6ea0>";
   fHtml += "<tr><td align=left>";
   fHtml += "<font face=Verdana size=3 color=ffffff><b><i>";
   fHtml += fName;
   fHtml += "</i></b></font></td>";
   fHtml += "<td>";
   fHtml += "<td align=right> ";
   fHtml += "<font face=Verdana size=3 color=ffffff><b><i>";
   fHtml += Form("Size = %d", fNValues);
   fHtml += "</i></b></font></td></tr>";
   fHtml += "</table>";
   fHtml += "</td></tr>";
}

//______________________________________________________________________________
void HtmlObjTable::BuildLabels()
{
   // Build table labels.

   Int_t i;
   fHtml += "<tr bgcolor=c0c0ff>";
   fHtml += "<th> </th>"; // for the check boxes
   for (i=0;i<fNFields;i++) {
      fHtml += "<th> ";
      fHtml += fLabels[i];
      fHtml += " </th>"; // for the check boxes
   }
   fHtml += "</tr>";
}

//______________________________________________________________________________
void HtmlObjTable::BuildTable()
{
   // Build part of table with values.

   for (int i = 0; i < fNValues; i++) {
      if (i%2)
         fHtml += "<tr bgcolor=e0e0ff>";
      else
         fHtml += "<tr bgcolor=ffffff>";
      
      TString name = fName;
      name.ReplaceAll(" ", "_");
      // checkboxes
      fHtml += "<td bgcolor=d0d0ff align=\"center\">";
      fHtml += "<input type=\"checkbox\" name=\"";
      fHtml += name;
      fHtml += Form("[%d]\">",i);
      fHtml += "</td>";

      for (int j = 0; j < fNFields; j++) {
         fHtml += "<td width=";
         fHtml += Form("%d%%", 100/fNFields);
         fHtml += " align=\"center\"";
         fHtml += ">";
         fHtml += Form("%1.4f", fValues[j][i]);
         fHtml += "</td>";
      }
      fHtml += "</tr> ";
   }
}

//______________________________________________________________________________
HtmlSummary::HtmlSummary(const char *title) : fNTables(0), fTitle(title)
{
   // Constructor.

   fObjTables = new TOrdCollection();
}

//______________________________________________________________________________
HtmlSummary::~HtmlSummary()
{
   // Destructor.

   Reset();
}

//______________________________________________________________________________
HtmlObjTable *HtmlSummary::AddTable(const char *name, Int_t nfields, Int_t nvals,
                                    Bool_t exp, Option_t *option)
{
   // Add a new table in our list of tables.

   TString opt = option;
   opt.ToLower();
   HtmlObjTable *table = new HtmlObjTable(name, nfields, nvals, exp);
   fNTables++;
   if (opt.Contains("first"))
      fObjTables->AddFirst(table);
   else
      fObjTables->Add(table);
   return table;
}

//______________________________________________________________________________
void HtmlSummary::Clear(Option_t *option)
{
   // Clear the table list.

   if (option && option[0] == 'D')
      fObjTables->Delete(option);
   else
      fObjTables->Clear(option);
   fNTables = 0;
}

//______________________________________________________________________________
void HtmlSummary::Reset(Option_t *)
{
   // Reset (delete) the table list;

   delete fObjTables; fObjTables = 0;
   fNTables = 0;
}

//______________________________________________________________________________
void HtmlSummary::Build()
{
   // Build the summary.

   MakeHeader();
   for (int i=0;i<fNTables;i++) {
      GetTable(i)->Build();
      fHtml += GetTable(i)->Html();
   }
   MakeFooter();
}

//______________________________________________________________________________
void HtmlSummary::MakeHeader()
{
   // Make HTML header.

   fHeader  = "<html><head><title>";
   fHeader += fTitle;
   fHeader += "</title></head><body>";
   fHeader += "<center><h2><font color=#2222ee><i>";
   fHeader += fTitle;
   fHeader += "</i></font></h2></center>";
   fHtml    = fHeader;
}

//______________________________________________________________________________
void HtmlSummary::MakeFooter()
{
   // Make HTML footer.

   fFooter  = "<br><p><br><center><strong><font size=2 color=#2222ee>";
   fFooter += "Example of using Html widget to display tabular data";
   fFooter += "<br>";
   fFooter += "© 2007-2008 Bertrand Bellenot";
   fFooter += "</font></strong></center></body></html>";  
   fHtml   += fFooter;
}

//______________________________________________________________________________
SplitGLView::SplitGLView(const TGWindow *p, UInt_t w, UInt_t h, Bool_t embed) :
   TGMainFrame(p, w, h), fActViewer(0), fShapedToolTip(0), fIsEmbedded(embed)
{
   // Main frame constructor.

   TGSplitFrame *frm;
   TEveScene *s = 0;
   TGHorizontalFrame *hfrm;
   TGDockableFrame *dfrm;
   TGPictureButton *button;

   // create the "file" popup menu
   fMenuFile = new TGPopupMenu(gClient->GetRoot());
   fMenuFile->AddEntry("&Open...", kFileOpen);
   fMenuFile->AddSeparator();
   fMenuFile->AddEntry( "&Update Summary", kSummaryUpdate);
   fMenuFile->AddSeparator();
   fMenuFile->AddEntry("&Load Config...", kFileLoadConfig);
   fMenuFile->AddEntry("&Save Config...", kFileSaveConfig);
   fMenuFile->AddSeparator();
   fMenuFile->AddEntry("E&xit", kFileExit);

   // create the "camera" popup menu
   fMenuCamera = new TGPopupMenu(gClient->GetRoot());
   fMenuCamera->AddEntry("Perspective (Floor XOZ)", kGLPerspXOZ);
   fMenuCamera->AddEntry("Perspective (Floor YOZ)", kGLPerspYOZ);
   fMenuCamera->AddEntry("Perspective (Floor XOY)", kGLPerspXOY);
   fMenuCamera->AddEntry("Orthographic (XOY)", kGLXOY);
   fMenuCamera->AddEntry("Orthographic (XOZ)", kGLXOZ);
   fMenuCamera->AddEntry("Orthographic (ZOY)", kGLZOY);
   fMenuCamera->AddSeparator();
   fMenuCamera->AddEntry("Ortho allow rotate", kGLOrthoRotate);
   fMenuCamera->AddEntry("Ortho allow dolly",  kGLOrthoDolly);

   fMenuScene = new TGPopupMenu(gClient->GetRoot());
   fMenuScene->AddEntry("&Update Current", kSceneUpdate);
   fMenuScene->AddEntry("Update &All", kSceneUpdateAll);

   // create the "help" popup menu
   fMenuHelp = new TGPopupMenu(gClient->GetRoot());
   fMenuHelp->AddEntry("&About", kHelpAbout);

   // create the main menu bar
   fMenuBar = new TGMenuBar(this, 1, 1, kHorizontalFrame);
   fMenuBar->AddPopup("&File", fMenuFile, new TGLayoutHints(kLHintsTop | 
                      kLHintsLeft, 0, 4, 0, 0));
   fMenuBar->AddPopup("&Camera", fMenuCamera, new TGLayoutHints(kLHintsTop | 
                      kLHintsLeft, 0, 4, 0, 0));
   fMenuBar->AddPopup("&Scene", fMenuScene, new TGLayoutHints(kLHintsTop | 
                      kLHintsLeft, 0, 4, 0, 0));
   fMenuBar->AddPopup("&Help", fMenuHelp, new TGLayoutHints(kLHintsTop | 
                      kLHintsRight));

   AddFrame(fMenuBar, new TGLayoutHints(kLHintsTop | kLHintsExpandX));

   // connect menu signals to our menu handler slot
   fMenuFile->Connect("Activated(Int_t)", "SplitGLView", this,
                      "HandleMenu(Int_t)");
   fMenuCamera->Connect("Activated(Int_t)", "SplitGLView", this,
                        "HandleMenu(Int_t)");
   fMenuScene->Connect("Activated(Int_t)", "SplitGLView", this,
                       "HandleMenu(Int_t)");
   fMenuHelp->Connect("Activated(Int_t)", "SplitGLView", this,
                      "HandleMenu(Int_t)");
   
   if (fIsEmbedded && gEve) {
      // use status bar from the browser
      fStatusBar = gEve->GetBrowser()->GetStatusBar();
   }
   else {
      // create the status bar
      Int_t parts[] = {45, 15, 10, 30};
      fStatusBar = new TGStatusBar(this, 50, 10);
      fStatusBar->SetParts(parts, 4);
      AddFrame(fStatusBar, new TGLayoutHints(kLHintsBottom | kLHintsExpandX, 
               0, 0, 10, 0));
   }

   // create eve pad (our geometry container)
   fPad = new TEvePad();
   fPad->SetFillColor(kBlack);

   // create the split frames
   fSplitFrame = new TGSplitFrame(this, 800, 600);
   AddFrame(fSplitFrame, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
   // split it once
   fSplitFrame->HSplit(434);
   // then split each part again (this will make four parts)
   fSplitFrame->GetSecond()->VSplit(266);
   fSplitFrame->GetSecond()->GetSecond()->VSplit(266);

   TGLOverlayButton *but1, *but2, *but3, *but4, *but5, *but6;
   // get top (main) split frame
   frm = fSplitFrame->GetFirst();
   frm->SetName("Main_View");

   // create (embed) a GL viewer inside
   fViewer0 = new TGLEmbeddedViewer(frm, fPad);
   but1 = new TGLOverlayButton(fViewer0, "Swap", 10.0, -10.0, 55.0, 16.0);
   but1->Connect("Clicked(TGLViewerBase*)", "SplitGLView", this, "SwapToMainView(TGLViewerBase*)");
   but2 = new TGLOverlayButton(fViewer0, "Undock", 70.0, -10.0, 55.0, 16.0);
   but2->Connect("Clicked(TGLViewerBase*)", "SplitGLView", this, "UnDock(TGLViewerBase*)");
   frm->AddFrame(fViewer0->GetFrame(), new TGLayoutHints(kLHintsExpandX | 
                 kLHintsExpandY));
   // set the camera to perspective (XOZ) for this viewer
   fViewer0->SetCurrentCamera(TGLViewer::kCameraPerspXOZ);
   // connect signal we are interested to
   fViewer0->Connect("MouseOver(TGLPhysicalShape*)", "SplitGLView", this, 
                      "OnMouseOver(TGLPhysicalShape*)");
   fViewer0->Connect("Activated()", "SplitGLView", this, 
                      "OnViewerActivated()");
   fViewer0->Connect("MouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)", 
                      "SplitGLView", this, 
                      "OnMouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)");
   fViewer0->Connect("Clicked(TObject*)", "SplitGLView", this, 
                      "OnClicked(TObject*)");
   fViewer[0] = new TEveViewer("SplitGLViewer[0]");
   fViewer[0]->SetGLViewer(fViewer0, fViewer0->GetFrame());
   fViewer[0]->IncDenyDestroy();
   if (fIsEmbedded && gEve) {
      fViewer[0]->AddScene(gEve->GetGlobalScene());
      fViewer[0]->AddScene(gEve->GetEventScene());
      gEve->AddElement(fViewer[0], gEve->GetViewers());
      s = gEve->SpawnNewScene("Rho-Z Projection");
      // projections
      fRhoZMgr = new TEveProjectionManager();
      gEve->AddElement(fRhoZMgr, (TEveElement *)s);
      gEve->AddToListTree(fRhoZMgr, kTRUE);
      TEveProjectionAxes* a = new TEveProjectionAxes(fRhoZMgr);
      s->AddElement(a);
   }

   // get bottom left split frame
   frm = fSplitFrame->GetSecond()->GetFirst();
   frm->SetName("Bottom_Left");

   // create (embed) a GL viewer inside
   fViewer1 = new TGLEmbeddedViewer(frm, fPad);
   but3 = new TGLOverlayButton(fViewer1, "Swap", 10.0, -10.0, 55.0, 16.0);
   but3->Connect("Clicked(TGLViewerBase*)", "SplitGLView", this, "SwapToMainView(TGLViewerBase*)");
   but4 = new TGLOverlayButton(fViewer1, "Undock", 70.0, -10.0, 55.0, 16.0);
   but4->Connect("Clicked(TGLViewerBase*)", "SplitGLView", this, "UnDock(TGLViewerBase*)");
   frm->AddFrame(fViewer1->GetFrame(), new TGLayoutHints(kLHintsExpandX | 
                  kLHintsExpandY));

   // set the camera to orthographic (XOY) for this viewer
   fViewer1->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
   // connect signal we are interested to
   fViewer1->Connect("MouseOver(TGLPhysicalShape*)", "SplitGLView", this, 
                      "OnMouseOver(TGLPhysicalShape*)");
   fViewer1->Connect("Activated()", "SplitGLView", this, 
                      "OnViewerActivated()");
   fViewer1->Connect("MouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)", 
                      "SplitGLView", this, 
                      "OnMouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)");
   fViewer1->Connect("Clicked(TObject*)", "SplitGLView", this, 
                      "OnClicked(TObject*)");
   fViewer[1] = new TEveViewer("SplitGLViewer[1]");
   fViewer[1]->SetGLViewer(fViewer1, fViewer1->GetFrame());
   fViewer[1]->IncDenyDestroy();
   if (fIsEmbedded && gEve) {
      fRhoZMgr->ImportElements((TEveElement *)gEve->GetGlobalScene());
      fRhoZMgr->ImportElements((TEveElement *)gEve->GetEventScene());
      fRhoZMgr->SetProjection(TEveProjection::kPT_RhoZ);
      fViewer[1]->AddScene(s);
      gEve->AddElement(fViewer[1], gEve->GetViewers());
      gRhoZMgr = fRhoZMgr;

      s = gEve->SpawnNewScene("R-Phi Projection");
      // projections
      fRPhiMgr = new TEveProjectionManager();
      gEve->AddElement(fRPhiMgr, (TEveElement *)s);
      gEve->AddToListTree(fRPhiMgr, kTRUE);
      TEveProjectionAxes* a = new TEveProjectionAxes(fRPhiMgr);
      s->AddElement(a);
   }

   // get bottom center split frame
   frm = fSplitFrame->GetSecond()->GetSecond()->GetFirst();
   frm->SetName("Bottom_Center");

   // create (embed) a GL viewer inside
   fViewer2 = new TGLEmbeddedViewer(frm, fPad);
   but5 = new TGLOverlayButton(fViewer2, "Swap", 10.0, -10.0, 55.0, 16.0);
   but5->Connect("Clicked(TGLViewerBase*)", "SplitGLView", this, "SwapToMainView(TGLViewerBase*)");
   but6 = new TGLOverlayButton(fViewer2, "Undock", 70.0, -10.0, 55.0, 16.0);
   but6->Connect("Clicked(TGLViewerBase*)", "SplitGLView", this, "UnDock(TGLViewerBase*)");
   frm->AddFrame(fViewer2->GetFrame(), new TGLayoutHints(kLHintsExpandX | 
                  kLHintsExpandY));

   // set the camera to orthographic (XOY) for this viewer
   fViewer2->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
   // connect signal we are interested to
   fViewer2->Connect("MouseOver(TGLPhysicalShape*)", "SplitGLView", this, 
                      "OnMouseOver(TGLPhysicalShape*)");
   fViewer2->Connect("Activated()", "SplitGLView", this, 
                      "OnViewerActivated()");
   fViewer2->Connect("MouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)", 
                      "SplitGLView", this, 
                      "OnMouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)");
   fViewer2->Connect("Clicked(TObject*)", "SplitGLView", this, 
                      "OnClicked(TObject*)");
   fViewer[2] = new TEveViewer("SplitGLViewer[2]");
   fViewer[2]->SetGLViewer(fViewer2, fViewer2->GetFrame());
   fViewer[2]->IncDenyDestroy();
   if (fIsEmbedded && gEve) {
      fRPhiMgr->ImportElements((TEveElement *)gEve->GetGlobalScene());
      fRPhiMgr->ImportElements((TEveElement *)gEve->GetEventScene());
      fRPhiMgr->SetProjection(TEveProjection::kPT_RPhi);
      fViewer[2]->AddScene(s);
      gEve->AddElement(fViewer[2], gEve->GetViewers());
      gRPhiMgr = fRPhiMgr;
   }

   // get bottom right split frame
   frm = fSplitFrame->GetSecond()->GetSecond()->GetSecond();
   frm->SetName("Bottom_Right");

   dfrm = new TGDockableFrame(frm);
   dfrm->SetFixedSize(kFALSE);
   dfrm->EnableHide(kFALSE);
   hfrm = new TGHorizontalFrame(dfrm);
   button= new TGPictureButton(hfrm, gClient->GetPicture("swap.png"));
   button->SetToolTipText("Swap to big view");
   hfrm->AddFrame(button);
   button->Connect("Clicked()","SplitGLView",this,"SwapToMainView(TGLViewerBase*=0)");
   fgHtmlSummary = new HtmlSummary("Alice Event Display Summary Table");
   fgHtml = new TGHtml(hfrm, 100, 100, -1);
   hfrm->AddFrame(fgHtml, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
   dfrm->AddFrame(hfrm, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
   frm->AddFrame(dfrm, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));

   if (fIsEmbedded && gEve) {
      gEve->GetListTree()->Connect("Clicked(TGListTreeItem*, Int_t, Int_t, Int_t)",
         "SplitGLView", this, "ItemClicked(TGListTreeItem*, Int_t, Int_t, Int_t)");
   }

   fShapedToolTip = new TGShapedToolTip("Default.png", 120, 22, 160, 110, 
                                        23, 115, 12, "#ffff80");
   Resize(GetDefaultSize());
   MapSubwindows();
   MapWindow();
   LoadConfig(".everc");
}

//______________________________________________________________________________
SplitGLView::~SplitGLView()
{
   // Clean up main frame...
   //Cleanup();
   
   fMenuFile->Disconnect("Activated(Int_t)", this, "HandleMenu(Int_t)");
   fMenuCamera->Disconnect("Activated(Int_t)", this, "HandleMenu(Int_t)");
   fMenuScene->Disconnect("Activated(Int_t)", this, "HandleMenu(Int_t)");
   fMenuHelp->Disconnect("Activated(Int_t)", this, "HandleMenu(Int_t)");
   fViewer0->Disconnect("MouseOver(TGLPhysicalShape*)", this, 
                         "OnMouseOver(TGLPhysicalShape*)");
   fViewer0->Disconnect("Activated()", this, "OnViewerActivated()");
   fViewer0->Disconnect("MouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)", 
                         this, "OnMouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)");
   fViewer1->Disconnect("MouseOver(TGLPhysicalShape*)", this, 
                         "OnMouseOver(TGLPhysicalShape*)");
   fViewer1->Disconnect("Activated()", this, "OnViewerActivated()");
   fViewer1->Disconnect("MouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)", 
                         this, "OnMouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)");
   fViewer2->Disconnect("MouseOver(TGLPhysicalShape*)", this, 
                         "OnMouseOver(TGLPhysicalShape*)");
   fViewer2->Disconnect("Activated()", this, "OnViewerActivated()");
   fViewer2->Disconnect("MouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)", 
                         this, "OnMouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)");
   if (!fIsEmbedded) {
      delete fViewer[0];
      delete fViewer[1];
      delete fViewer[2];
   }
   delete fShapedToolTip;
   delete fMenuFile;
   delete fMenuScene;
   delete fMenuCamera;
   delete fMenuHelp;
   if (!fIsEmbedded)
      delete fMenuBar;
   delete fViewer0;
   delete fViewer1;
   delete fViewer2;
   delete fSplitFrame;
   delete fPad;
   if (!fIsEmbedded) {
      delete fStatusBar;
      gApplication->Terminate(0);
   }
}

//______________________________________________________________________________
void SplitGLView::HandleMenu(Int_t id)
{
   // Handle menu items.

   static TString rcdir(".");
   static TString rcfile(".everc");

   switch (id) {

      case kFileOpen:
         {
            static TString dir(".");
            TGFileInfo fi;
            fi.fFileTypes = filetypes;
            fi.fIniDir    = StrDup(dir);
            new TGFileDialog(gClient->GetRoot(), this, kFDOpen, &fi);
            if (fi.fFilename)
               OpenFile(fi.fFilename);
            dir = fi.fIniDir;
         }
         break;

      case kFileLoadConfig:
         {
            TGFileInfo fi;
            fi.fFileTypes = rcfiletypes;
            fi.fIniDir    = StrDup(rcdir);
            fi.fFilename  = StrDup(rcfile);
            new TGFileDialog(gClient->GetRoot(), this, kFDOpen, &fi);
            if (fi.fFilename) {
               rcfile = fi.fFilename;
               LoadConfig(fi.fFilename);
            }
            rcdir = fi.fIniDir;
         }
         break;

      case kFileSaveConfig:
         {
            TGFileInfo fi;
            fi.fFileTypes = rcfiletypes;
            fi.fIniDir    = StrDup(rcdir);
            fi.fFilename  = StrDup(rcfile);
            new TGFileDialog(gClient->GetRoot(), this, kFDSave, &fi);
            if (fi.fFilename) {
               rcfile = fi.fFilename;
               SaveConfig(fi.fFilename);
            }
            rcdir = fi.fIniDir;
         }
         break;

      case kFileExit:
         CloseWindow();
         break;

      case kGLPerspYOZ:
         if (fActViewer)
            fActViewer->SetCurrentCamera(TGLViewer::kCameraPerspYOZ);
         break;
      case kGLPerspXOZ:
         if (fActViewer)
            fActViewer->SetCurrentCamera(TGLViewer::kCameraPerspXOZ);
         break;
      case kGLPerspXOY:
         if (fActViewer)
            fActViewer->SetCurrentCamera(TGLViewer::kCameraPerspXOY);
         break;
      case kGLXOY:
         if (fActViewer)
            fActViewer->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
         break;
      case kGLXOZ:
         if (fActViewer)
            fActViewer->SetCurrentCamera(TGLViewer::kCameraOrthoXOZ);
         break;
      case kGLZOY:
         if (fActViewer)
            fActViewer->SetCurrentCamera(TGLViewer::kCameraOrthoZOY);
         break;
      case kGLOrthoRotate:
         ToggleOrthoRotate();
         break;
      case kGLOrthoDolly:
         ToggleOrthoDolly();
         break;

      case kSceneUpdate:
         if (fActViewer)
            fActViewer->UpdateScene();
         UpdateSummary();
         break;

      case kSceneUpdateAll:
         fViewer0->UpdateScene();
         fViewer1->UpdateScene();
         fViewer2->UpdateScene();
         UpdateSummary();
         break;

      case kSummaryUpdate:
         UpdateSummary();
         break;

      case kHelpAbout:
         {
#ifdef R__UNIX
            TString rootx;
# ifdef ROOTBINDIR
            rootx = ROOTBINDIR;
# else
            rootx = gSystem->Getenv("ROOTSYS");
            if (!rootx.IsNull()) rootx += "/bin";
# endif
            rootx += "/root -a &";
            gSystem->Exec(rootx);
#else
#ifdef WIN32
            new TWin32SplashThread(kTRUE);
#else
            char str[32];
            sprintf(str, "About ROOT %s...", gROOT->GetVersion());
            hd = new TRootHelpDialog(this, str, 600, 400);
            hd->SetText(gHelpAbout);
            hd->Popup();
#endif
#endif
         }
         break;

      default:
         break;
   }
}

//______________________________________________________________________________
void SplitGLView::OnClicked(TObject *obj)
{
   // Handle click events in GL viewer

   if (obj)
      fStatusBar->SetText(Form("User clicked on: \"%s\"", obj->GetName()), 1);
   else
      fStatusBar->SetText("", 1);
}

//______________________________________________________________________________
void SplitGLView::OnMouseIdle(TGLPhysicalShape *shape, UInt_t posx, UInt_t posy)
{
   // Slot used to handle "OnMouseIdle" signal coming from any GL viewer.
   // We receive a pointer on the physical shape in which the mouse cursor is
   // and the actual cursor position (x,y)

   Window_t wtarget;
   Int_t    x = 0, y = 0;

   static TH1F *h1f = 0;
   TFormula *form1 = new TFormula("form1","abs(sin(x)/x)");
   form1->Update(); // silent warning about unused variable...
   TF1 *sqroot = new TF1("sqroot","x*gaus(0) + [3]*form1",0,10);
   sqroot->SetParameters(10,4,1,20);
   if (h1f == 0)
      h1f = new TH1F("h1f","",50,0,10);
   h1f->Reset();
   h1f->SetFillColor(45);
   h1f->SetStats(0);
   h1f->FillRandom("sqroot",200);

   if (fShapedToolTip) {
      fShapedToolTip->UnmapWindow();
   }
   if (shape && shape->GetLogical() && shape->GetLogical()->GetExternal()) {
      // get the actual viewer who actually emitted the signal
      TGLEmbeddedViewer *actViewer = dynamic_cast<TGLEmbeddedViewer*>((TQObject*)gTQSender);
      // then translate coordinates from the root (screen) coordinates 
      // to the actual frame (viewer) ones
      gVirtualX->TranslateCoordinates(actViewer->GetFrame()->GetId(),
               gClient->GetDefaultRoot()->GetId(), posx, posy, x, y,
               wtarget);
      // Then display our tooltip at this x,y location
      if (fShapedToolTip) {
         fShapedToolTip->Show(x+5, y+5, Form("%s\n     \n%s",
                              shape->GetLogical()->GetExternal()->IsA()->GetName(), 
                              shape->GetLogical()->GetExternal()->GetName()), h1f);
      }
   }
}

//______________________________________________________________________________
void SplitGLView::OnMouseOver(TGLPhysicalShape *shape)
{
   // Slot used to handle "OnMouseOver" signal coming from any GL viewer.
   // We receive a pointer on the physical shape in which the mouse cursor is.

   // display informations on the physical shape in the status bar
   if (shape && shape->GetLogical() && shape->GetLogical()->GetExternal())
      fStatusBar->SetText(Form("Mouse Over: \"%s\"", 
         shape->GetLogical()->GetExternal()->GetName()), 0);
   else
      fStatusBar->SetText("", 0);
}

//______________________________________________________________________________
void SplitGLView::OnViewerActivated()
{
   // Slot used to handle "Activated" signal coming from any GL viewer.
   // Used to know which GL viewer is active.

   static Pixel_t green = 0;
   // set the actual GL viewer frame to default color
   if (fActViewer && fActViewer->GetFrame())
      fActViewer->GetFrame()->ChangeBackground(GetDefaultFrameBackground());

   // change the actual GL viewer to the one who emitted the signal
   // fActViewer = (TGLEmbeddedViewer *)gTQSender;
   fActViewer = dynamic_cast<TGLEmbeddedViewer*>((TQObject*)gTQSender);

   if (fActViewer == 0) {
      printf ("dyncast failed ...\n");
      return;
   }

   // get the highlight color (only once)
   if (green == 0) {
      gClient->GetColorByName("green", green);
   }
   // set the new actual GL viewer frame to highlight color
   if (fActViewer->GetFrame())
      fActViewer->GetFrame()->ChangeBackground(green);

   // update menu entries to match actual viewer's options
   if (fActViewer->GetOrthoXOYCamera()->GetDollyToZoom() &&
       fActViewer->GetOrthoXOZCamera()->GetDollyToZoom() &&
       fActViewer->GetOrthoZOYCamera()->GetDollyToZoom())
      fMenuCamera->UnCheckEntry(kGLOrthoDolly);
   else
      fMenuCamera->CheckEntry(kGLOrthoDolly);

   if (fActViewer->GetOrthoXOYCamera()->GetEnableRotate() &&
       fActViewer->GetOrthoXOYCamera()->GetEnableRotate() &&
       fActViewer->GetOrthoXOYCamera()->GetEnableRotate())
      fMenuCamera->CheckEntry(kGLOrthoRotate);
   else
      fMenuCamera->UnCheckEntry(kGLOrthoRotate);
}

//______________________________________________________________________________
void SplitGLView::OpenFile(const char *fname)
{
   // Open a Root file to display a geometry in the GL viewers.

   TString filename = fname;
   // check if the file type is correct
   if (!filename.EndsWith(".root")) {
      new TGMsgBox(gClient->GetRoot(), this, "OpenFile",
                   Form("The file \"%s\" is not a root file!", fname),
                   kMBIconExclamation, kMBOk);
      return;
   }
   // check if the root file contains a geometry
   if (TGeoManager::Import(fname) == 0) {
      new TGMsgBox(gClient->GetRoot(), this, "OpenFile",
                   Form("The file \"%s\" does't contain a geometry", fname),
                   kMBIconExclamation, kMBOk);
      return;
   }
   gGeoManager->DefaultColors();
   // delete previous primitives (if any)
   fPad->GetListOfPrimitives()->Delete();
   // and add the geometry to eve pad (container)
   fPad->GetListOfPrimitives()->Add(gGeoManager->GetTopVolume());
   // paint the geometry in each GL viewer
   fViewer0->PadPaint(fPad);
   fViewer1->PadPaint(fPad);
   fViewer2->PadPaint(fPad);
}

//______________________________________________________________________________
void SplitGLView::ToggleOrthoRotate()
{
   // Toggle state of the 'Ortho allow rotate' menu entry.

   if (fMenuCamera->IsEntryChecked(kGLOrthoRotate))
      fMenuCamera->UnCheckEntry(kGLOrthoRotate);
   else
      fMenuCamera->CheckEntry(kGLOrthoRotate);
   Bool_t state = fMenuCamera->IsEntryChecked(kGLOrthoRotate);
   if (fActViewer) {
      fActViewer->GetOrthoXOYCamera()->SetEnableRotate(state);
      fActViewer->GetOrthoXOYCamera()->SetEnableRotate(state);
      fActViewer->GetOrthoXOYCamera()->SetEnableRotate(state);
   }
}

//______________________________________________________________________________
void SplitGLView::ToggleOrthoDolly()
{
   // Toggle state of the 'Ortho allow dolly' menu entry.

   if (fMenuCamera->IsEntryChecked(kGLOrthoDolly))
      fMenuCamera->UnCheckEntry(kGLOrthoDolly);
   else
      fMenuCamera->CheckEntry(kGLOrthoDolly);
   Bool_t state = ! fMenuCamera->IsEntryChecked(kGLOrthoDolly);
   if (fActViewer) {
      fActViewer->GetOrthoXOYCamera()->SetDollyToZoom(state);
      fActViewer->GetOrthoXOZCamera()->SetDollyToZoom(state);
      fActViewer->GetOrthoZOYCamera()->SetDollyToZoom(state);
   }
}

//______________________________________________________________________________
void SplitGLView::ItemClicked(TGListTreeItem *item, Int_t, Int_t, Int_t)
{
   // Item has been clicked, based on mouse button do:

   static const TEveException eh("SplitGLView::ItemClicked ");
   TEveElement* re = (TEveElement*)item->GetUserData();
   if(re == 0) return;
   TObject* obj = re->GetObject(eh);
   if (obj->InheritsFrom("TEveViewer")) {
      TGLViewer *v = ((TEveViewer *)obj)->GetGLViewer();
      //v->Activated();
      if (v->InheritsFrom("TGLEmbeddedViewer")) {
         TGLEmbeddedViewer *ev = (TGLEmbeddedViewer *)v;
         gVirtualX->SetInputFocus(ev->GetGLWidget()->GetId());
      }
   }
}

//______________________________________________________________________________
void SplitGLView::LoadConfig(const char *fname)
{

   Int_t height, width;
   TEnv *env = new TEnv(fname);

   Int_t mainheight = env->GetValue("MainView.Height", 434);
   Int_t blwidth    = env->GetValue("Bottom.Left.Width", 266);
   Int_t bcwidth    = env->GetValue("Bottom.Center.Width", 266);
   Int_t brwidth    = env->GetValue("Bottom.Right.Width", 266);
   Int_t top_height = env->GetValue("Right.Tab.Height", 0);
   Int_t bottom_height = env->GetValue("Bottom.Tab.Height", 0);

   if (fIsEmbedded && gEve) {
      Int_t sel = env->GetValue("Eve.Selection", gEve->GetSelection()->GetPickToSelect());
      Int_t hi = env->GetValue("Eve.Highlight", gEve->GetHighlight()->GetPickToSelect());
      gEve->GetBrowser()->EveMenu(9+sel);
      gEve->GetBrowser()->EveMenu(13+hi);

      width  = env->GetValue("Eve.Width", (Int_t)gEve->GetBrowser()->GetWidth());
      height = env->GetValue("Eve.Height", (Int_t)gEve->GetBrowser()->GetHeight());
      gEve->GetBrowser()->Resize(width, height);
   }

   // top (main) split frame
   width = fSplitFrame->GetFirst()->GetWidth();
   fSplitFrame->GetFirst()->Resize(width, mainheight);
   // bottom left split frame
   height = fSplitFrame->GetSecond()->GetFirst()->GetHeight();
   fSplitFrame->GetSecond()->GetFirst()->Resize(blwidth, height);
   // bottom center split frame
   height = fSplitFrame->GetSecond()->GetSecond()->GetFirst()->GetHeight();
   fSplitFrame->GetSecond()->GetSecond()->GetFirst()->Resize(bcwidth, height);
   // bottom right split frame
   height = fSplitFrame->GetSecond()->GetSecond()->GetSecond()->GetHeight();
   fSplitFrame->GetSecond()->GetSecond()->GetSecond()->Resize(brwidth, height);

   fSplitFrame->Layout();

   if (fIsEmbedded && gEve) {
      width = ((TGCompositeFrame *)gEve->GetBrowser()->GetTabBottom()->GetParent())->GetWidth();
      ((TGCompositeFrame *)gEve->GetBrowser()->GetTabBottom()->GetParent())->Resize(width, bottom_height);
      width = ((TGCompositeFrame *)gEve->GetBrowser()->GetTabRight()->GetParent())->GetWidth();
      ((TGCompositeFrame *)gEve->GetBrowser()->GetTabRight()->GetParent())->Resize(width, top_height);
   }
}

//______________________________________________________________________________
void SplitGLView::SaveConfig(const char *fname)
{

   Int_t bottom_height = 0;
   Int_t top_height = 0;
   TGSplitFrame *frm;
   TEnv *env = new TEnv(fname);

   if (fIsEmbedded && gEve) {
      env->SetValue("Eve.Width", (Int_t)gEve->GetBrowser()->GetWidth());
      env->SetValue("Eve.Height", (Int_t)gEve->GetBrowser()->GetHeight());
   }
   // get top (main) split frame
   frm = fSplitFrame->GetFirst();
   env->SetValue("MainView.Height", (Int_t)frm->GetHeight());
   // get bottom left split frame
   frm = fSplitFrame->GetSecond()->GetFirst();
   env->SetValue("Bottom.Left.Width", (Int_t)frm->GetWidth());
   // get bottom center split frame
   frm = fSplitFrame->GetSecond()->GetSecond()->GetFirst();
   env->SetValue("Bottom.Center.Width", (Int_t)frm->GetWidth());
   // get bottom right split frame
   frm = fSplitFrame->GetSecond()->GetSecond()->GetSecond();
   env->SetValue("Bottom.Right.Width", (Int_t)frm->GetWidth());
   if (fIsEmbedded && gEve) {
      top_height = (Int_t)((TGCompositeFrame *)gEve->GetBrowser()->GetTabRight()->GetParent())->GetHeight();
      env->SetValue("Right.Tab.Height", top_height);
      bottom_height = (Int_t)((TGCompositeFrame *)gEve->GetBrowser()->GetTabBottom()->GetParent())->GetHeight();
      env->SetValue("Bottom.Tab.Height", bottom_height);

      env->SetValue("Eve.Selection", gEve->GetSelection()->GetPickToSelect());
      env->SetValue("Eve.Highlight", gEve->GetHighlight()->GetPickToSelect());
   }

   env->SaveLevel(kEnvLocal);
#ifdef R__WIN32
   if (!gSystem->AccessPathName(Form("%s.new", fname))) {
      gSystem->Exec(Form("del %s", fname));
      gSystem->Rename(Form("%s.new", fname), fname);
   }
#endif
}

//______________________________________________________________________________
void SplitGLView::SwapToMainView(TGLViewerBase *viewer)
{
   // Swap frame embedded in a splitframe to the main view (slot method).

   TGCompositeFrame *parent = 0;
   if (!fSplitFrame->GetFirst()->GetFrame())
      return;
   if (viewer == 0) {
      TGPictureButton *src = (TGPictureButton*)gTQSender;
      parent = (TGCompositeFrame *)src->GetParent();
      while (parent && !parent->InheritsFrom("TGSplitFrame")) {
         parent = (TGCompositeFrame *)parent->GetParent();
      }
   }
   else {
      TGCompositeFrame *src = ((TGLEmbeddedViewer *)viewer)->GetFrame();
      if (!src) return;
      TGLOverlayButton *but = (TGLOverlayButton *)((TQObject *)gTQSender);
      but->ResetState();
      parent = (TGCompositeFrame *)src->GetParent();
   }
   if (parent && parent->InheritsFrom("TGSplitFrame"))
      ((TGSplitFrame *)parent)->SwitchToMain();
}

//______________________________________________________________________________
void SplitGLView::UnDock(TGLViewerBase *viewer)
{
   // Undock frame embedded in a splitframe (slot method).

   TGCompositeFrame *src = ((TGLEmbeddedViewer *)viewer)->GetFrame();
   if (!src) return;
   TGLOverlayButton *but = (TGLOverlayButton *)((TQObject *)gTQSender);
   but->ResetState();
   TGCompositeFrame *parent = (TGCompositeFrame *)src->GetParent();
   if (parent && parent->InheritsFrom("TGSplitFrame"))
      ((TGSplitFrame *)parent)->ExtractFrame();
}

//______________________________________________________________________________
void SplitGLView::UpdateSummary()
{
   // Update summary of current event.

   TEveElement::List_i i;
   TEveElement::List_i j;
   Int_t k;
   TEveElement *el;
   HtmlObjTable *table;
   TEveEventManager *mgr = gEve ? gEve->GetCurrentEvent() : 0;
   if (mgr) {
      fgHtmlSummary->Clear("D");
      for (i=mgr->BeginChildren(); i!=mgr->EndChildren(); ++i) {
         el = ((TEveElement*)(*i));
         if (el->IsA() == TEvePointSet::Class()) {
            TEvePointSet *ps = (TEvePointSet *)el;
            TString ename  = ps->GetElementName();
            TString etitle = ps->GetElementTitle();
            if (ename.First('\'') != kNPOS)
               ename.Remove(ename.First('\''));
            etitle.Remove(0, 2);
            Int_t nel = atoi(etitle.Data());
            table = fgHtmlSummary->AddTable(ename, 0, nel);
         }
         else if (el->IsA() == TEveTrackList::Class()) {
            TEveTrackList *tracks = (TEveTrackList *)el;
            TString ename  = tracks->GetElementName();
            if (ename.First('\'') != kNPOS)
               ename.Remove(ename.First('\''));
            table = fgHtmlSummary->AddTable(ename.Data(), 5, 
                     tracks->NumChildren(), kTRUE, "first");
            table->SetLabel(0, "Momentum");
            table->SetLabel(1, "P_t");
            table->SetLabel(2, "Phi");
            table->SetLabel(3, "Theta");
            table->SetLabel(4, "Eta");
            k=0;
            for (j=tracks->BeginChildren(); j!=tracks->EndChildren(); ++j) {
               Float_t p     = ((TEveTrack*)(*j))->GetMomentum().Mag();
               table->SetValue(0, k, p);
               Float_t pt    = ((TEveTrack*)(*j))->GetMomentum().Perp();
               table->SetValue(1, k, pt);
               Float_t phi   = ((TEveTrack*)(*j))->GetMomentum().Phi();
               table->SetValue(2, k, phi);
               Float_t theta = ((TEveTrack*)(*j))->GetMomentum().Theta();
               table->SetValue(3, k, theta);
               Float_t eta   = ((TEveTrack*)(*j))->GetMomentum().Eta();
               table->SetValue(4, k, eta);
               ++k;
            }
         }
      }
      fgHtmlSummary->Build();
      fgHtml->Clear();
      fgHtml->ParseText((char*)fgHtmlSummary->Html().Data());
      fgHtml->Layout();
   }
}

// Linkdef
#ifdef __CINT__

#pragma link C++ class SplitGLView;

#endif

#ifdef __CINT__
void SplitGLView()
{
   printf("This script is used via ACLiC by the macro \"alice_esd_split.C\"\n");
   printf("To see it in action, just run \".x alice_esd_split.C\"\n");
   return;
}
#endif


 SplitGLView.C:1
 SplitGLView.C:2
 SplitGLView.C:3
 SplitGLView.C:4
 SplitGLView.C:5
 SplitGLView.C:6
 SplitGLView.C:7
 SplitGLView.C:8
 SplitGLView.C:9
 SplitGLView.C:10
 SplitGLView.C:11
 SplitGLView.C:12
 SplitGLView.C:13
 SplitGLView.C:14
 SplitGLView.C:15
 SplitGLView.C:16
 SplitGLView.C:17
 SplitGLView.C:18
 SplitGLView.C:19
 SplitGLView.C:20
 SplitGLView.C:21
 SplitGLView.C:22
 SplitGLView.C:23
 SplitGLView.C:24
 SplitGLView.C:25
 SplitGLView.C:26
 SplitGLView.C:27
 SplitGLView.C:28
 SplitGLView.C:29
 SplitGLView.C:30
 SplitGLView.C:31
 SplitGLView.C:32
 SplitGLView.C:33
 SplitGLView.C:34
 SplitGLView.C:35
 SplitGLView.C:36
 SplitGLView.C:37
 SplitGLView.C:38
 SplitGLView.C:39
 SplitGLView.C:40
 SplitGLView.C:41
 SplitGLView.C:42
 SplitGLView.C:43
 SplitGLView.C:44
 SplitGLView.C:45
 SplitGLView.C:46
 SplitGLView.C:47
 SplitGLView.C:48
 SplitGLView.C:49
 SplitGLView.C:50
 SplitGLView.C:51
 SplitGLView.C:52
 SplitGLView.C:53
 SplitGLView.C:54
 SplitGLView.C:55
 SplitGLView.C:56
 SplitGLView.C:57
 SplitGLView.C:58
 SplitGLView.C:59
 SplitGLView.C:60
 SplitGLView.C:61
 SplitGLView.C:62
 SplitGLView.C:63
 SplitGLView.C:64
 SplitGLView.C:65
 SplitGLView.C:66
 SplitGLView.C:67
 SplitGLView.C:68
 SplitGLView.C:69
 SplitGLView.C:70
 SplitGLView.C:71
 SplitGLView.C:72
 SplitGLView.C:73
 SplitGLView.C:74
 SplitGLView.C:75
 SplitGLView.C:76
 SplitGLView.C:77
 SplitGLView.C:78
 SplitGLView.C:79
 SplitGLView.C:80
 SplitGLView.C:81
 SplitGLView.C:82
 SplitGLView.C:83
 SplitGLView.C:84
 SplitGLView.C:85
 SplitGLView.C:86
 SplitGLView.C:87
 SplitGLView.C:88
 SplitGLView.C:89
 SplitGLView.C:90
 SplitGLView.C:91
 SplitGLView.C:92
 SplitGLView.C:93
 SplitGLView.C:94
 SplitGLView.C:95
 SplitGLView.C:96
 SplitGLView.C:97
 SplitGLView.C:98
 SplitGLView.C:99
 SplitGLView.C:100
 SplitGLView.C:101
 SplitGLView.C:102
 SplitGLView.C:103
 SplitGLView.C:104
 SplitGLView.C:105
 SplitGLView.C:106
 SplitGLView.C:107
 SplitGLView.C:108
 SplitGLView.C:109
 SplitGLView.C:110
 SplitGLView.C:111
 SplitGLView.C:112
 SplitGLView.C:113
 SplitGLView.C:114
 SplitGLView.C:115
 SplitGLView.C:116
 SplitGLView.C:117
 SplitGLView.C:118
 SplitGLView.C:119
 SplitGLView.C:120
 SplitGLView.C:121
 SplitGLView.C:122
 SplitGLView.C:123
 SplitGLView.C:124
 SplitGLView.C:125
 SplitGLView.C:126
 SplitGLView.C:127
 SplitGLView.C:128
 SplitGLView.C:129
 SplitGLView.C:130
 SplitGLView.C:131
 SplitGLView.C:132
 SplitGLView.C:133
 SplitGLView.C:134
 SplitGLView.C:135
 SplitGLView.C:136
 SplitGLView.C:137
 SplitGLView.C:138
 SplitGLView.C:139
 SplitGLView.C:140
 SplitGLView.C:141
 SplitGLView.C:142
 SplitGLView.C:143
 SplitGLView.C:144
 SplitGLView.C:145
 SplitGLView.C:146
 SplitGLView.C:147
 SplitGLView.C:148
 SplitGLView.C:149
 SplitGLView.C:150
 SplitGLView.C:151
 SplitGLView.C:152
 SplitGLView.C:153
 SplitGLView.C:154
 SplitGLView.C:155
 SplitGLView.C:156
 SplitGLView.C:157
 SplitGLView.C:158
 SplitGLView.C:159
 SplitGLView.C:160
 SplitGLView.C:161
 SplitGLView.C:162
 SplitGLView.C:163
 SplitGLView.C:164
 SplitGLView.C:165
 SplitGLView.C:166
 SplitGLView.C:167
 SplitGLView.C:168
 SplitGLView.C:169
 SplitGLView.C:170
 SplitGLView.C:171
 SplitGLView.C:172
 SplitGLView.C:173
 SplitGLView.C:174
 SplitGLView.C:175
 SplitGLView.C:176
 SplitGLView.C:177
 SplitGLView.C:178
 SplitGLView.C:179
 SplitGLView.C:180
 SplitGLView.C:181
 SplitGLView.C:182
 SplitGLView.C:183
 SplitGLView.C:184
 SplitGLView.C:185
 SplitGLView.C:186
 SplitGLView.C:187
 SplitGLView.C:188
 SplitGLView.C:189
 SplitGLView.C:190
 SplitGLView.C:191
 SplitGLView.C:192
 SplitGLView.C:193
 SplitGLView.C:194
 SplitGLView.C:195
 SplitGLView.C:196
 SplitGLView.C:197
 SplitGLView.C:198
 SplitGLView.C:199
 SplitGLView.C:200
 SplitGLView.C:201
 SplitGLView.C:202
 SplitGLView.C:203
 SplitGLView.C:204
 SplitGLView.C:205
 SplitGLView.C:206
 SplitGLView.C:207
 SplitGLView.C:208
 SplitGLView.C:209
 SplitGLView.C:210
 SplitGLView.C:211
 SplitGLView.C:212
 SplitGLView.C:213
 SplitGLView.C:214
 SplitGLView.C:215
 SplitGLView.C:216
 SplitGLView.C:217
 SplitGLView.C:218
 SplitGLView.C:219
 SplitGLView.C:220
 SplitGLView.C:221
 SplitGLView.C:222
 SplitGLView.C:223
 SplitGLView.C:224
 SplitGLView.C:225
 SplitGLView.C:226
 SplitGLView.C:227
 SplitGLView.C:228
 SplitGLView.C:229
 SplitGLView.C:230
 SplitGLView.C:231
 SplitGLView.C:232
 SplitGLView.C:233
 SplitGLView.C:234
 SplitGLView.C:235
 SplitGLView.C:236
 SplitGLView.C:237
 SplitGLView.C:238
 SplitGLView.C:239
 SplitGLView.C:240
 SplitGLView.C:241
 SplitGLView.C:242
 SplitGLView.C:243
 SplitGLView.C:244
 SplitGLView.C:245
 SplitGLView.C:246
 SplitGLView.C:247
 SplitGLView.C:248
 SplitGLView.C:249
 SplitGLView.C:250
 SplitGLView.C:251
 SplitGLView.C:252
 SplitGLView.C:253
 SplitGLView.C:254
 SplitGLView.C:255
 SplitGLView.C:256
 SplitGLView.C:257
 SplitGLView.C:258
 SplitGLView.C:259
 SplitGLView.C:260
 SplitGLView.C:261
 SplitGLView.C:262
 SplitGLView.C:263
 SplitGLView.C:264
 SplitGLView.C:265
 SplitGLView.C:266
 SplitGLView.C:267
 SplitGLView.C:268
 SplitGLView.C:269
 SplitGLView.C:270
 SplitGLView.C:271
 SplitGLView.C:272
 SplitGLView.C:273
 SplitGLView.C:274
 SplitGLView.C:275
 SplitGLView.C:276
 SplitGLView.C:277
 SplitGLView.C:278
 SplitGLView.C:279
 SplitGLView.C:280
 SplitGLView.C:281
 SplitGLView.C:282
 SplitGLView.C:283
 SplitGLView.C:284
 SplitGLView.C:285
 SplitGLView.C:286
 SplitGLView.C:287
 SplitGLView.C:288
 SplitGLView.C:289
 SplitGLView.C:290
 SplitGLView.C:291
 SplitGLView.C:292
 SplitGLView.C:293
 SplitGLView.C:294
 SplitGLView.C:295
 SplitGLView.C:296
 SplitGLView.C:297
 SplitGLView.C:298
 SplitGLView.C:299
 SplitGLView.C:300
 SplitGLView.C:301
 SplitGLView.C:302
 SplitGLView.C:303
 SplitGLView.C:304
 SplitGLView.C:305
 SplitGLView.C:306
 SplitGLView.C:307
 SplitGLView.C:308
 SplitGLView.C:309
 SplitGLView.C:310
 SplitGLView.C:311
 SplitGLView.C:312
 SplitGLView.C:313
 SplitGLView.C:314
 SplitGLView.C:315
 SplitGLView.C:316
 SplitGLView.C:317
 SplitGLView.C:318
 SplitGLView.C:319
 SplitGLView.C:320
 SplitGLView.C:321
 SplitGLView.C:322
 SplitGLView.C:323
 SplitGLView.C:324
 SplitGLView.C:325
 SplitGLView.C:326
 SplitGLView.C:327
 SplitGLView.C:328
 SplitGLView.C:329
 SplitGLView.C:330
 SplitGLView.C:331
 SplitGLView.C:332
 SplitGLView.C:333
 SplitGLView.C:334
 SplitGLView.C:335
 SplitGLView.C:336
 SplitGLView.C:337
 SplitGLView.C:338
 SplitGLView.C:339
 SplitGLView.C:340
 SplitGLView.C:341
 SplitGLView.C:342
 SplitGLView.C:343
 SplitGLView.C:344
 SplitGLView.C:345
 SplitGLView.C:346
 SplitGLView.C:347
 SplitGLView.C:348
 SplitGLView.C:349
 SplitGLView.C:350
 SplitGLView.C:351
 SplitGLView.C:352
 SplitGLView.C:353
 SplitGLView.C:354
 SplitGLView.C:355
 SplitGLView.C:356
 SplitGLView.C:357
 SplitGLView.C:358
 SplitGLView.C:359
 SplitGLView.C:360
 SplitGLView.C:361
 SplitGLView.C:362
 SplitGLView.C:363
 SplitGLView.C:364
 SplitGLView.C:365
 SplitGLView.C:366
 SplitGLView.C:367
 SplitGLView.C:368
 SplitGLView.C:369
 SplitGLView.C:370
 SplitGLView.C:371
 SplitGLView.C:372
 SplitGLView.C:373
 SplitGLView.C:374
 SplitGLView.C:375
 SplitGLView.C:376
 SplitGLView.C:377
 SplitGLView.C:378
 SplitGLView.C:379
 SplitGLView.C:380
 SplitGLView.C:381
 SplitGLView.C:382
 SplitGLView.C:383
 SplitGLView.C:384
 SplitGLView.C:385
 SplitGLView.C:386
 SplitGLView.C:387
 SplitGLView.C:388
 SplitGLView.C:389
 SplitGLView.C:390
 SplitGLView.C:391
 SplitGLView.C:392
 SplitGLView.C:393
 SplitGLView.C:394
 SplitGLView.C:395
 SplitGLView.C:396
 SplitGLView.C:397
 SplitGLView.C:398
 SplitGLView.C:399
 SplitGLView.C:400
 SplitGLView.C:401
 SplitGLView.C:402
 SplitGLView.C:403
 SplitGLView.C:404
 SplitGLView.C:405
 SplitGLView.C:406
 SplitGLView.C:407
 SplitGLView.C:408
 SplitGLView.C:409
 SplitGLView.C:410
 SplitGLView.C:411
 SplitGLView.C:412
 SplitGLView.C:413
 SplitGLView.C:414
 SplitGLView.C:415
 SplitGLView.C:416
 SplitGLView.C:417
 SplitGLView.C:418
 SplitGLView.C:419
 SplitGLView.C:420
 SplitGLView.C:421
 SplitGLView.C:422
 SplitGLView.C:423
 SplitGLView.C:424
 SplitGLView.C:425
 SplitGLView.C:426
 SplitGLView.C:427
 SplitGLView.C:428
 SplitGLView.C:429
 SplitGLView.C:430
 SplitGLView.C:431
 SplitGLView.C:432
 SplitGLView.C:433
 SplitGLView.C:434
 SplitGLView.C:435
 SplitGLView.C:436
 SplitGLView.C:437
 SplitGLView.C:438
 SplitGLView.C:439
 SplitGLView.C:440
 SplitGLView.C:441
 SplitGLView.C:442
 SplitGLView.C:443
 SplitGLView.C:444
 SplitGLView.C:445
 SplitGLView.C:446
 SplitGLView.C:447
 SplitGLView.C:448
 SplitGLView.C:449
 SplitGLView.C:450
 SplitGLView.C:451
 SplitGLView.C:452
 SplitGLView.C:453
 SplitGLView.C:454
 SplitGLView.C:455
 SplitGLView.C:456
 SplitGLView.C:457
 SplitGLView.C:458
 SplitGLView.C:459
 SplitGLView.C:460
 SplitGLView.C:461
 SplitGLView.C:462
 SplitGLView.C:463
 SplitGLView.C:464
 SplitGLView.C:465
 SplitGLView.C:466
 SplitGLView.C:467
 SplitGLView.C:468
 SplitGLView.C:469
 SplitGLView.C:470
 SplitGLView.C:471
 SplitGLView.C:472
 SplitGLView.C:473
 SplitGLView.C:474
 SplitGLView.C:475
 SplitGLView.C:476
 SplitGLView.C:477
 SplitGLView.C:478
 SplitGLView.C:479
 SplitGLView.C:480
 SplitGLView.C:481
 SplitGLView.C:482
 SplitGLView.C:483
 SplitGLView.C:484
 SplitGLView.C:485
 SplitGLView.C:486
 SplitGLView.C:487
 SplitGLView.C:488
 SplitGLView.C:489
 SplitGLView.C:490
 SplitGLView.C:491
 SplitGLView.C:492
 SplitGLView.C:493
 SplitGLView.C:494
 SplitGLView.C:495
 SplitGLView.C:496
 SplitGLView.C:497
 SplitGLView.C:498
 SplitGLView.C:499
 SplitGLView.C:500
 SplitGLView.C:501
 SplitGLView.C:502
 SplitGLView.C:503
 SplitGLView.C:504
 SplitGLView.C:505
 SplitGLView.C:506
 SplitGLView.C:507
 SplitGLView.C:508
 SplitGLView.C:509
 SplitGLView.C:510
 SplitGLView.C:511
 SplitGLView.C:512
 SplitGLView.C:513
 SplitGLView.C:514
 SplitGLView.C:515
 SplitGLView.C:516
 SplitGLView.C:517
 SplitGLView.C:518
 SplitGLView.C:519
 SplitGLView.C:520
 SplitGLView.C:521
 SplitGLView.C:522
 SplitGLView.C:523
 SplitGLView.C:524
 SplitGLView.C:525
 SplitGLView.C:526
 SplitGLView.C:527
 SplitGLView.C:528
 SplitGLView.C:529
 SplitGLView.C:530
 SplitGLView.C:531
 SplitGLView.C:532
 SplitGLView.C:533
 SplitGLView.C:534
 SplitGLView.C:535
 SplitGLView.C:536
 SplitGLView.C:537
 SplitGLView.C:538
 SplitGLView.C:539
 SplitGLView.C:540
 SplitGLView.C:541
 SplitGLView.C:542
 SplitGLView.C:543
 SplitGLView.C:544
 SplitGLView.C:545
 SplitGLView.C:546
 SplitGLView.C:547
 SplitGLView.C:548
 SplitGLView.C:549
 SplitGLView.C:550
 SplitGLView.C:551
 SplitGLView.C:552
 SplitGLView.C:553
 SplitGLView.C:554
 SplitGLView.C:555
 SplitGLView.C:556
 SplitGLView.C:557
 SplitGLView.C:558
 SplitGLView.C:559
 SplitGLView.C:560
 SplitGLView.C:561
 SplitGLView.C:562
 SplitGLView.C:563
 SplitGLView.C:564
 SplitGLView.C:565
 SplitGLView.C:566
 SplitGLView.C:567
 SplitGLView.C:568
 SplitGLView.C:569
 SplitGLView.C:570
 SplitGLView.C:571
 SplitGLView.C:572
 SplitGLView.C:573
 SplitGLView.C:574
 SplitGLView.C:575
 SplitGLView.C:576
 SplitGLView.C:577
 SplitGLView.C:578
 SplitGLView.C:579
 SplitGLView.C:580
 SplitGLView.C:581
 SplitGLView.C:582
 SplitGLView.C:583
 SplitGLView.C:584
 SplitGLView.C:585
 SplitGLView.C:586
 SplitGLView.C:587
 SplitGLView.C:588
 SplitGLView.C:589
 SplitGLView.C:590
 SplitGLView.C:591
 SplitGLView.C:592
 SplitGLView.C:593
 SplitGLView.C:594
 SplitGLView.C:595
 SplitGLView.C:596
 SplitGLView.C:597
 SplitGLView.C:598
 SplitGLView.C:599
 SplitGLView.C:600
 SplitGLView.C:601
 SplitGLView.C:602
 SplitGLView.C:603
 SplitGLView.C:604
 SplitGLView.C:605
 SplitGLView.C:606
 SplitGLView.C:607
 SplitGLView.C:608
 SplitGLView.C:609
 SplitGLView.C:610
 SplitGLView.C:611
 SplitGLView.C:612
 SplitGLView.C:613
 SplitGLView.C:614
 SplitGLView.C:615
 SplitGLView.C:616
 SplitGLView.C:617
 SplitGLView.C:618
 SplitGLView.C:619
 SplitGLView.C:620
 SplitGLView.C:621
 SplitGLView.C:622
 SplitGLView.C:623
 SplitGLView.C:624
 SplitGLView.C:625
 SplitGLView.C:626
 SplitGLView.C:627
 SplitGLView.C:628
 SplitGLView.C:629
 SplitGLView.C:630
 SplitGLView.C:631
 SplitGLView.C:632
 SplitGLView.C:633
 SplitGLView.C:634
 SplitGLView.C:635
 SplitGLView.C:636
 SplitGLView.C:637
 SplitGLView.C:638
 SplitGLView.C:639
 SplitGLView.C:640
 SplitGLView.C:641
 SplitGLView.C:642
 SplitGLView.C:643
 SplitGLView.C:644
 SplitGLView.C:645
 SplitGLView.C:646
 SplitGLView.C:647
 SplitGLView.C:648
 SplitGLView.C:649
 SplitGLView.C:650
 SplitGLView.C:651
 SplitGLView.C:652
 SplitGLView.C:653
 SplitGLView.C:654
 SplitGLView.C:655
 SplitGLView.C:656
 SplitGLView.C:657
 SplitGLView.C:658
 SplitGLView.C:659
 SplitGLView.C:660
 SplitGLView.C:661
 SplitGLView.C:662
 SplitGLView.C:663
 SplitGLView.C:664
 SplitGLView.C:665
 SplitGLView.C:666
 SplitGLView.C:667
 SplitGLView.C:668
 SplitGLView.C:669
 SplitGLView.C:670
 SplitGLView.C:671
 SplitGLView.C:672
 SplitGLView.C:673
 SplitGLView.C:674
 SplitGLView.C:675
 SplitGLView.C:676
 SplitGLView.C:677
 SplitGLView.C:678
 SplitGLView.C:679
 SplitGLView.C:680
 SplitGLView.C:681
 SplitGLView.C:682
 SplitGLView.C:683
 SplitGLView.C:684
 SplitGLView.C:685
 SplitGLView.C:686
 SplitGLView.C:687
 SplitGLView.C:688
 SplitGLView.C:689
 SplitGLView.C:690
 SplitGLView.C:691
 SplitGLView.C:692
 SplitGLView.C:693
 SplitGLView.C:694
 SplitGLView.C:695
 SplitGLView.C:696
 SplitGLView.C:697
 SplitGLView.C:698
 SplitGLView.C:699
 SplitGLView.C:700
 SplitGLView.C:701
 SplitGLView.C:702
 SplitGLView.C:703
 SplitGLView.C:704
 SplitGLView.C:705
 SplitGLView.C:706
 SplitGLView.C:707
 SplitGLView.C:708
 SplitGLView.C:709
 SplitGLView.C:710
 SplitGLView.C:711
 SplitGLView.C:712
 SplitGLView.C:713
 SplitGLView.C:714
 SplitGLView.C:715
 SplitGLView.C:716
 SplitGLView.C:717
 SplitGLView.C:718
 SplitGLView.C:719
 SplitGLView.C:720
 SplitGLView.C:721
 SplitGLView.C:722
 SplitGLView.C:723
 SplitGLView.C:724
 SplitGLView.C:725
 SplitGLView.C:726
 SplitGLView.C:727
 SplitGLView.C:728
 SplitGLView.C:729
 SplitGLView.C:730
 SplitGLView.C:731
 SplitGLView.C:732
 SplitGLView.C:733
 SplitGLView.C:734
 SplitGLView.C:735
 SplitGLView.C:736
 SplitGLView.C:737
 SplitGLView.C:738
 SplitGLView.C:739
 SplitGLView.C:740
 SplitGLView.C:741
 SplitGLView.C:742
 SplitGLView.C:743
 SplitGLView.C:744
 SplitGLView.C:745
 SplitGLView.C:746
 SplitGLView.C:747
 SplitGLView.C:748
 SplitGLView.C:749
 SplitGLView.C:750
 SplitGLView.C:751
 SplitGLView.C:752
 SplitGLView.C:753
 SplitGLView.C:754
 SplitGLView.C:755
 SplitGLView.C:756
 SplitGLView.C:757
 SplitGLView.C:758
 SplitGLView.C:759
 SplitGLView.C:760
 SplitGLView.C:761
 SplitGLView.C:762
 SplitGLView.C:763
 SplitGLView.C:764
 SplitGLView.C:765
 SplitGLView.C:766
 SplitGLView.C:767
 SplitGLView.C:768
 SplitGLView.C:769
 SplitGLView.C:770
 SplitGLView.C:771
 SplitGLView.C:772
 SplitGLView.C:773
 SplitGLView.C:774
 SplitGLView.C:775
 SplitGLView.C:776
 SplitGLView.C:777
 SplitGLView.C:778
 SplitGLView.C:779
 SplitGLView.C:780
 SplitGLView.C:781
 SplitGLView.C:782
 SplitGLView.C:783
 SplitGLView.C:784
 SplitGLView.C:785
 SplitGLView.C:786
 SplitGLView.C:787
 SplitGLView.C:788
 SplitGLView.C:789
 SplitGLView.C:790
 SplitGLView.C:791
 SplitGLView.C:792
 SplitGLView.C:793
 SplitGLView.C:794
 SplitGLView.C:795
 SplitGLView.C:796
 SplitGLView.C:797
 SplitGLView.C:798
 SplitGLView.C:799
 SplitGLView.C:800
 SplitGLView.C:801
 SplitGLView.C:802
 SplitGLView.C:803
 SplitGLView.C:804
 SplitGLView.C:805
 SplitGLView.C:806
 SplitGLView.C:807
 SplitGLView.C:808
 SplitGLView.C:809
 SplitGLView.C:810
 SplitGLView.C:811
 SplitGLView.C:812
 SplitGLView.C:813
 SplitGLView.C:814
 SplitGLView.C:815
 SplitGLView.C:816
 SplitGLView.C:817
 SplitGLView.C:818
 SplitGLView.C:819
 SplitGLView.C:820
 SplitGLView.C:821
 SplitGLView.C:822
 SplitGLView.C:823
 SplitGLView.C:824
 SplitGLView.C:825
 SplitGLView.C:826
 SplitGLView.C:827
 SplitGLView.C:828
 SplitGLView.C:829
 SplitGLView.C:830
 SplitGLView.C:831
 SplitGLView.C:832
 SplitGLView.C:833
 SplitGLView.C:834
 SplitGLView.C:835
 SplitGLView.C:836
 SplitGLView.C:837
 SplitGLView.C:838
 SplitGLView.C:839
 SplitGLView.C:840
 SplitGLView.C:841
 SplitGLView.C:842
 SplitGLView.C:843
 SplitGLView.C:844
 SplitGLView.C:845
 SplitGLView.C:846
 SplitGLView.C:847
 SplitGLView.C:848
 SplitGLView.C:849
 SplitGLView.C:850
 SplitGLView.C:851
 SplitGLView.C:852
 SplitGLView.C:853
 SplitGLView.C:854
 SplitGLView.C:855
 SplitGLView.C:856
 SplitGLView.C:857
 SplitGLView.C:858
 SplitGLView.C:859
 SplitGLView.C:860
 SplitGLView.C:861
 SplitGLView.C:862
 SplitGLView.C:863
 SplitGLView.C:864
 SplitGLView.C:865
 SplitGLView.C:866
 SplitGLView.C:867
 SplitGLView.C:868
 SplitGLView.C:869
 SplitGLView.C:870
 SplitGLView.C:871
 SplitGLView.C:872
 SplitGLView.C:873
 SplitGLView.C:874
 SplitGLView.C:875
 SplitGLView.C:876
 SplitGLView.C:877
 SplitGLView.C:878
 SplitGLView.C:879
 SplitGLView.C:880
 SplitGLView.C:881
 SplitGLView.C:882
 SplitGLView.C:883
 SplitGLView.C:884
 SplitGLView.C:885
 SplitGLView.C:886
 SplitGLView.C:887
 SplitGLView.C:888
 SplitGLView.C:889
 SplitGLView.C:890
 SplitGLView.C:891
 SplitGLView.C:892
 SplitGLView.C:893
 SplitGLView.C:894
 SplitGLView.C:895
 SplitGLView.C:896
 SplitGLView.C:897
 SplitGLView.C:898
 SplitGLView.C:899
 SplitGLView.C:900
 SplitGLView.C:901
 SplitGLView.C:902
 SplitGLView.C:903
 SplitGLView.C:904
 SplitGLView.C:905
 SplitGLView.C:906
 SplitGLView.C:907
 SplitGLView.C:908
 SplitGLView.C:909
 SplitGLView.C:910
 SplitGLView.C:911
 SplitGLView.C:912
 SplitGLView.C:913
 SplitGLView.C:914
 SplitGLView.C:915
 SplitGLView.C:916
 SplitGLView.C:917
 SplitGLView.C:918
 SplitGLView.C:919
 SplitGLView.C:920
 SplitGLView.C:921
 SplitGLView.C:922
 SplitGLView.C:923
 SplitGLView.C:924
 SplitGLView.C:925
 SplitGLView.C:926
 SplitGLView.C:927
 SplitGLView.C:928
 SplitGLView.C:929
 SplitGLView.C:930
 SplitGLView.C:931
 SplitGLView.C:932
 SplitGLView.C:933
 SplitGLView.C:934
 SplitGLView.C:935
 SplitGLView.C:936
 SplitGLView.C:937
 SplitGLView.C:938
 SplitGLView.C:939
 SplitGLView.C:940
 SplitGLView.C:941
 SplitGLView.C:942
 SplitGLView.C:943
 SplitGLView.C:944
 SplitGLView.C:945
 SplitGLView.C:946
 SplitGLView.C:947
 SplitGLView.C:948
 SplitGLView.C:949
 SplitGLView.C:950
 SplitGLView.C:951
 SplitGLView.C:952
 SplitGLView.C:953
 SplitGLView.C:954
 SplitGLView.C:955
 SplitGLView.C:956
 SplitGLView.C:957
 SplitGLView.C:958
 SplitGLView.C:959
 SplitGLView.C:960
 SplitGLView.C:961
 SplitGLView.C:962
 SplitGLView.C:963
 SplitGLView.C:964
 SplitGLView.C:965
 SplitGLView.C:966
 SplitGLView.C:967
 SplitGLView.C:968
 SplitGLView.C:969
 SplitGLView.C:970
 SplitGLView.C:971
 SplitGLView.C:972
 SplitGLView.C:973
 SplitGLView.C:974
 SplitGLView.C:975
 SplitGLView.C:976
 SplitGLView.C:977
 SplitGLView.C:978
 SplitGLView.C:979
 SplitGLView.C:980
 SplitGLView.C:981
 SplitGLView.C:982
 SplitGLView.C:983
 SplitGLView.C:984
 SplitGLView.C:985
 SplitGLView.C:986
 SplitGLView.C:987
 SplitGLView.C:988
 SplitGLView.C:989
 SplitGLView.C:990
 SplitGLView.C:991
 SplitGLView.C:992
 SplitGLView.C:993
 SplitGLView.C:994
 SplitGLView.C:995
 SplitGLView.C:996
 SplitGLView.C:997
 SplitGLView.C:998
 SplitGLView.C:999
 SplitGLView.C:1000
 SplitGLView.C:1001
 SplitGLView.C:1002
 SplitGLView.C:1003
 SplitGLView.C:1004
 SplitGLView.C:1005
 SplitGLView.C:1006
 SplitGLView.C:1007
 SplitGLView.C:1008
 SplitGLView.C:1009
 SplitGLView.C:1010
 SplitGLView.C:1011
 SplitGLView.C:1012
 SplitGLView.C:1013
 SplitGLView.C:1014
 SplitGLView.C:1015
 SplitGLView.C:1016
 SplitGLView.C:1017
 SplitGLView.C:1018
 SplitGLView.C:1019
 SplitGLView.C:1020
 SplitGLView.C:1021
 SplitGLView.C:1022
 SplitGLView.C:1023
 SplitGLView.C:1024
 SplitGLView.C:1025
 SplitGLView.C:1026
 SplitGLView.C:1027
 SplitGLView.C:1028
 SplitGLView.C:1029
 SplitGLView.C:1030
 SplitGLView.C:1031
 SplitGLView.C:1032
 SplitGLView.C:1033
 SplitGLView.C:1034
 SplitGLView.C:1035
 SplitGLView.C:1036
 SplitGLView.C:1037
 SplitGLView.C:1038
 SplitGLView.C:1039
 SplitGLView.C:1040
 SplitGLView.C:1041
 SplitGLView.C:1042
 SplitGLView.C:1043
 SplitGLView.C:1044
 SplitGLView.C:1045
 SplitGLView.C:1046
 SplitGLView.C:1047
 SplitGLView.C:1048
 SplitGLView.C:1049
 SplitGLView.C:1050
 SplitGLView.C:1051
 SplitGLView.C:1052
 SplitGLView.C:1053
 SplitGLView.C:1054
 SplitGLView.C:1055
 SplitGLView.C:1056
 SplitGLView.C:1057
 SplitGLView.C:1058
 SplitGLView.C:1059
 SplitGLView.C:1060
 SplitGLView.C:1061
 SplitGLView.C:1062
 SplitGLView.C:1063
 SplitGLView.C:1064
 SplitGLView.C:1065
 SplitGLView.C:1066
 SplitGLView.C:1067
 SplitGLView.C:1068
 SplitGLView.C:1069
 SplitGLView.C:1070
 SplitGLView.C:1071
 SplitGLView.C:1072
 SplitGLView.C:1073
 SplitGLView.C:1074
 SplitGLView.C:1075
 SplitGLView.C:1076
 SplitGLView.C:1077
 SplitGLView.C:1078
 SplitGLView.C:1079
 SplitGLView.C:1080
 SplitGLView.C:1081
 SplitGLView.C:1082
 SplitGLView.C:1083
 SplitGLView.C:1084
 SplitGLView.C:1085
 SplitGLView.C:1086
 SplitGLView.C:1087
 SplitGLView.C:1088
 SplitGLView.C:1089
 SplitGLView.C:1090
 SplitGLView.C:1091
 SplitGLView.C:1092
 SplitGLView.C:1093
 SplitGLView.C:1094
 SplitGLView.C:1095
 SplitGLView.C:1096
 SplitGLView.C:1097
 SplitGLView.C:1098
 SplitGLView.C:1099
 SplitGLView.C:1100
 SplitGLView.C:1101
 SplitGLView.C:1102
 SplitGLView.C:1103
 SplitGLView.C:1104
 SplitGLView.C:1105
 SplitGLView.C:1106
 SplitGLView.C:1107
 SplitGLView.C:1108
 SplitGLView.C:1109
 SplitGLView.C:1110
 SplitGLView.C:1111
 SplitGLView.C:1112
 SplitGLView.C:1113
 SplitGLView.C:1114
 SplitGLView.C:1115
 SplitGLView.C:1116
 SplitGLView.C:1117
 SplitGLView.C:1118
 SplitGLView.C:1119
 SplitGLView.C:1120
 SplitGLView.C:1121
 SplitGLView.C:1122
 SplitGLView.C:1123
 SplitGLView.C:1124
 SplitGLView.C:1125
 SplitGLView.C:1126
 SplitGLView.C:1127
 SplitGLView.C:1128
 SplitGLView.C:1129
 SplitGLView.C:1130
 SplitGLView.C:1131
 SplitGLView.C:1132
 SplitGLView.C:1133
 SplitGLView.C:1134
 SplitGLView.C:1135
 SplitGLView.C:1136
 SplitGLView.C:1137
 SplitGLView.C:1138
 SplitGLView.C:1139
 SplitGLView.C:1140
 SplitGLView.C:1141
 SplitGLView.C:1142
 SplitGLView.C:1143
 SplitGLView.C:1144
 SplitGLView.C:1145
 SplitGLView.C:1146
 SplitGLView.C:1147
 SplitGLView.C:1148
 SplitGLView.C:1149
 SplitGLView.C:1150
 SplitGLView.C:1151
 SplitGLView.C:1152
 SplitGLView.C:1153
 SplitGLView.C:1154
 SplitGLView.C:1155
 SplitGLView.C:1156
 SplitGLView.C:1157
 SplitGLView.C:1158
 SplitGLView.C:1159
 SplitGLView.C:1160
 SplitGLView.C:1161
 SplitGLView.C:1162
 SplitGLView.C:1163
 SplitGLView.C:1164
 SplitGLView.C:1165
 SplitGLView.C:1166
 SplitGLView.C:1167
 SplitGLView.C:1168
 SplitGLView.C:1169
 SplitGLView.C:1170
 SplitGLView.C:1171
 SplitGLView.C:1172
 SplitGLView.C:1173
 SplitGLView.C:1174
 SplitGLView.C:1175
 SplitGLView.C:1176
 SplitGLView.C:1177
 SplitGLView.C:1178
 SplitGLView.C:1179
 SplitGLView.C:1180
 SplitGLView.C:1181
 SplitGLView.C:1182
 SplitGLView.C:1183
 SplitGLView.C:1184
 SplitGLView.C:1185
 SplitGLView.C:1186
 SplitGLView.C:1187
 SplitGLView.C:1188
 SplitGLView.C:1189
 SplitGLView.C:1190
 SplitGLView.C:1191
 SplitGLView.C:1192
 SplitGLView.C:1193
 SplitGLView.C:1194
 SplitGLView.C:1195
 SplitGLView.C:1196
 SplitGLView.C:1197
 SplitGLView.C:1198
 SplitGLView.C:1199
 SplitGLView.C:1200
 SplitGLView.C:1201
 SplitGLView.C:1202
 SplitGLView.C:1203
 SplitGLView.C:1204
 SplitGLView.C:1205
 SplitGLView.C:1206
 SplitGLView.C:1207
 SplitGLView.C:1208
 SplitGLView.C:1209
 SplitGLView.C:1210
 SplitGLView.C:1211
 SplitGLView.C:1212
 SplitGLView.C:1213
 SplitGLView.C:1214
 SplitGLView.C:1215
 SplitGLView.C:1216
 SplitGLView.C:1217
 SplitGLView.C:1218
 SplitGLView.C:1219
 SplitGLView.C:1220
 SplitGLView.C:1221
 SplitGLView.C:1222
 SplitGLView.C:1223
 SplitGLView.C:1224
 SplitGLView.C:1225
 SplitGLView.C:1226
 SplitGLView.C:1227
 SplitGLView.C:1228
 SplitGLView.C:1229
 SplitGLView.C:1230
 SplitGLView.C:1231
 SplitGLView.C:1232
 SplitGLView.C:1233
 SplitGLView.C:1234
 SplitGLView.C:1235
 SplitGLView.C:1236
 SplitGLView.C:1237
 SplitGLView.C:1238
 SplitGLView.C:1239
 SplitGLView.C:1240
 SplitGLView.C:1241
 SplitGLView.C:1242
 SplitGLView.C:1243
 SplitGLView.C:1244
 SplitGLView.C:1245
 SplitGLView.C:1246
 SplitGLView.C:1247
 SplitGLView.C:1248
 SplitGLView.C:1249
 SplitGLView.C:1250
 SplitGLView.C:1251
 SplitGLView.C:1252
 SplitGLView.C:1253
 SplitGLView.C:1254
 SplitGLView.C:1255
 SplitGLView.C:1256
 SplitGLView.C:1257
 SplitGLView.C:1258
 SplitGLView.C:1259
 SplitGLView.C:1260
 SplitGLView.C:1261
 SplitGLView.C:1262
 SplitGLView.C:1263
 SplitGLView.C:1264
 SplitGLView.C:1265
 SplitGLView.C:1266
 SplitGLView.C:1267
 SplitGLView.C:1268
 SplitGLView.C:1269
 SplitGLView.C:1270
 SplitGLView.C:1271
 SplitGLView.C:1272
 SplitGLView.C:1273
 SplitGLView.C:1274
 SplitGLView.C:1275
 SplitGLView.C:1276
 SplitGLView.C:1277
 SplitGLView.C:1278
 SplitGLView.C:1279
 SplitGLView.C:1280
 SplitGLView.C:1281
 SplitGLView.C:1282
 SplitGLView.C:1283
 SplitGLView.C:1284
 SplitGLView.C:1285
 SplitGLView.C:1286
 SplitGLView.C:1287
 SplitGLView.C:1288
 SplitGLView.C:1289
 SplitGLView.C:1290
 SplitGLView.C:1291
 SplitGLView.C:1292
 SplitGLView.C:1293
 SplitGLView.C:1294
 SplitGLView.C:1295
 SplitGLView.C:1296
 SplitGLView.C:1297
 SplitGLView.C:1298
 SplitGLView.C:1299
 SplitGLView.C:1300
 SplitGLView.C:1301
 SplitGLView.C:1302
 SplitGLView.C:1303
 SplitGLView.C:1304
 SplitGLView.C:1305
 SplitGLView.C:1306
 SplitGLView.C:1307
 SplitGLView.C:1308
 SplitGLView.C:1309
 SplitGLView.C:1310
 SplitGLView.C:1311
 SplitGLView.C:1312
 SplitGLView.C:1313
 SplitGLView.C:1314
 SplitGLView.C:1315
 SplitGLView.C:1316
 SplitGLView.C:1317
 SplitGLView.C:1318
 SplitGLView.C:1319
 SplitGLView.C:1320
 SplitGLView.C:1321
 SplitGLView.C:1322
 SplitGLView.C:1323
 SplitGLView.C:1324
 SplitGLView.C:1325
 SplitGLView.C:1326
 SplitGLView.C:1327
 SplitGLView.C:1328
 SplitGLView.C:1329
 SplitGLView.C:1330
 SplitGLView.C:1331
 SplitGLView.C:1332
 SplitGLView.C:1333
 SplitGLView.C:1334
 SplitGLView.C:1335
 SplitGLView.C:1336
 SplitGLView.C:1337
 SplitGLView.C:1338
 SplitGLView.C:1339
 SplitGLView.C:1340
 SplitGLView.C:1341
 SplitGLView.C:1342
 SplitGLView.C:1343
 SplitGLView.C:1344
 SplitGLView.C:1345
 SplitGLView.C:1346
 SplitGLView.C:1347
 SplitGLView.C:1348
 SplitGLView.C:1349
 SplitGLView.C:1350
 SplitGLView.C:1351
 SplitGLView.C:1352
 SplitGLView.C:1353
 SplitGLView.C:1354
 SplitGLView.C:1355
 SplitGLView.C:1356
 SplitGLView.C:1357
 SplitGLView.C:1358
 SplitGLView.C:1359
 SplitGLView.C:1360
 SplitGLView.C:1361
 SplitGLView.C:1362
 SplitGLView.C:1363
 SplitGLView.C:1364
 SplitGLView.C:1365
 SplitGLView.C:1366
 SplitGLView.C:1367
 SplitGLView.C:1368
 SplitGLView.C:1369
 SplitGLView.C:1370
 SplitGLView.C:1371
 SplitGLView.C:1372
 SplitGLView.C:1373
 SplitGLView.C:1374
 SplitGLView.C:1375
 SplitGLView.C:1376
 SplitGLView.C:1377
 SplitGLView.C:1378
 SplitGLView.C:1379
 SplitGLView.C:1380
 SplitGLView.C:1381
 SplitGLView.C:1382
 SplitGLView.C:1383
 SplitGLView.C:1384
 SplitGLView.C:1385
 SplitGLView.C:1386
 SplitGLView.C:1387
 SplitGLView.C:1388
 SplitGLView.C:1389
 SplitGLView.C:1390
 SplitGLView.C:1391
 SplitGLView.C:1392
 SplitGLView.C:1393
 SplitGLView.C:1394
 SplitGLView.C:1395
 SplitGLView.C:1396
 SplitGLView.C:1397
 SplitGLView.C:1398
 SplitGLView.C:1399
 SplitGLView.C:1400
 SplitGLView.C:1401
 SplitGLView.C:1402
 SplitGLView.C:1403
 SplitGLView.C:1404
 SplitGLView.C:1405
 SplitGLView.C:1406
 SplitGLView.C:1407
 SplitGLView.C:1408
 SplitGLView.C:1409
 SplitGLView.C:1410
 SplitGLView.C:1411
 SplitGLView.C:1412
 SplitGLView.C:1413
 SplitGLView.C:1414
 SplitGLView.C:1415
 SplitGLView.C:1416
 SplitGLView.C:1417
 SplitGLView.C:1418
 SplitGLView.C:1419
 SplitGLView.C:1420
 SplitGLView.C:1421
 SplitGLView.C:1422
 SplitGLView.C:1423
 SplitGLView.C:1424
 SplitGLView.C:1425
 SplitGLView.C:1426
 SplitGLView.C:1427
 SplitGLView.C:1428
 SplitGLView.C:1429
 SplitGLView.C:1430
 SplitGLView.C:1431
 SplitGLView.C:1432
 SplitGLView.C:1433
 SplitGLView.C:1434
 SplitGLView.C:1435
 SplitGLView.C:1436
 SplitGLView.C:1437
 SplitGLView.C:1438
 SplitGLView.C:1439
 SplitGLView.C:1440
 SplitGLView.C:1441
 SplitGLView.C:1442
 SplitGLView.C:1443
 SplitGLView.C:1444
 SplitGLView.C:1445
 SplitGLView.C:1446
 SplitGLView.C:1447
 SplitGLView.C:1448
 SplitGLView.C:1449
 SplitGLView.C:1450
 SplitGLView.C:1451
 SplitGLView.C:1452
 SplitGLView.C:1453
 SplitGLView.C:1454