// @(#)root/eve:$Id$
// Authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

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

#include "TEveViewer.h"
#include "TEveScene.h"
#include "TEveSceneInfo.h"

#include "TEveManager.h"
#include "TEveSelection.h"

#include "TGLFormat.h"
#include "TGLSAViewer.h"
#include "TGLEmbeddedViewer.h"
#include "TGLScenePad.h"

#include "TGLEventHandler.h"

#include "TApplication.h"
#include "TEnv.h"
#include "TSystem.h"

//==============================================================================
//==============================================================================
// TEveViewer
//==============================================================================

//______________________________________________________________________________
//
// Eve representation of TGLViewer.
//
// The gl-viewer is owned by this class and is deleted in destructor.
//
// The frame is not deleted, it is expected that the gl-viewer implementation
// will delete that. TGLSAViewer and TGEmbeddedViewer both do so.
// This could be an optional argument to SetGLViewer. A frame could be
// passed as well.
//
// When stand-alone viewer is requested, it will come up with menu-hiding
// enabled by default. If you dislike this, add the following line to rootrc
// file (or set corresponding gEnv entry in application initialization):
//   Eve.Viewer.HideMenus: off

ClassImp(TEveViewer);

Bool_t TEveViewer::fgInitInternal        = kFALSE;
Bool_t TEveViewer::fgRecreateGlOnDockOps = kFALSE;

//______________________________________________________________________________
TEveViewer::TEveViewer(const char* n, const char* t) :
   TEveWindowFrame(0, n, t),
   fGLViewer      (0),
   fGLViewerFrame (0)
{
   // Constructor.
   // The base-class TEveWindowFrame is constructed without a frame so
   // a default composite-frame is instantiated and stored in fGUIFrame.
   // Cleanup is set to no-cleanup as viewers need to be zapped with some
   // more care.

   SetChildClass(TEveSceneInfo::Class());
   fGUIFrame->SetCleanup(kNoCleanup); // the gl-viewer's frame deleted elsewhere.

   if (!fgInitInternal)
   {
      InitInternal();
   }
}

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

   fGLViewer->SetEventHandler(0);

   fGLViewerFrame->UnmapWindow();
   GetGUICompositeFrame()->RemoveFrame(fGLViewerFrame);
   fGLViewerFrame->ReparentWindow(gClient->GetDefaultRoot());
   TTimer::SingleShot(150, "TGLViewer", fGLViewer, "Delete()");
}

/******************************************************************************/

//______________________________________________________________________________
void TEveViewer::InitInternal()
{
   // Initialize static data-members according to running conditions.

   // Determine if display is running on a mac.
   // This also works for ssh connection mac->linux.
   fgRecreateGlOnDockOps = (gVirtualX->SupportsExtension("Apple-WM") == 1);

   fgInitInternal = kTRUE;
}

//______________________________________________________________________________
void TEveViewer::PreUndock()
{
   // Virtual function called before a window is undocked.
   // On mac we have to force recreation of gl-context.

   TEveWindowFrame::PreUndock();
   if (fgRecreateGlOnDockOps)
   {
      // Mac only: TGLWidget can be already deleted
      // in case of recursive delete
      if (fGLViewer->GetGLWidget())
      {
         fGLViewer->DestroyGLWidget();
      }
   }
}

//______________________________________________________________________________
void TEveViewer::PostDock()
{
   // Virtual function called after a window is docked.
   // On mac we have to force recreation of gl-context.

   if (fgRecreateGlOnDockOps) {
      fGLViewer->CreateGLWidget();
   }
   TEveWindowFrame::PostDock();
}

/******************************************************************************/

//______________________________________________________________________________
const TGPicture* TEveViewer::GetListTreeIcon(Bool_t)
{
   // Return TEveViewer icon.

   return TEveElement::fgListTreeIcons[1];
}

//______________________________________________________________________________
void TEveViewer::SetGLViewer(TGLViewer* viewer, TGFrame* frame)
{
   // Set TGLViewer that is represented by this object.
   // The old gl-viewer is deleted.

   delete fGLViewer;
   fGLViewer      = viewer;
   fGLViewerFrame = frame;

   fGLViewer->SetSmartRefresh(kTRUE);
}

//______________________________________________________________________________
TGLSAViewer* TEveViewer::SpawnGLViewer(TGedEditor* ged, Bool_t stereo)
{
   // Spawn new GLViewer and adopt it.

   static const TEveException kEH("TEveViewer::SpawnGLViewer ");

   TGCompositeFrame* cf = GetGUICompositeFrame();

   TGLFormat *form = 0;
   if (stereo)
   {
      form = new TGLFormat;
      form->SetStereo(kTRUE);
   }

   cf->SetEditable(kTRUE);
   TGLSAViewer* v = 0;
   try
   {
      v = new TGLSAViewer(cf, 0, ged, form);
   }
   catch (std::exception&)
   {
      Error("SpawnGLViewer", "Insufficient support from the graphics hardware. Aborting.");
      gApplication->Terminate(1);
   }
   cf->SetEditable(kFALSE);
   v->ToggleEditObject();
   v->DisableCloseMenuEntries();
   if (gEnv->GetValue("Eve.Viewer.HideMenus", 1) == 1)
   {
      v->EnableMenuBarHiding();
   }
   SetGLViewer(v, v->GetFrame());

   if (stereo)
      v->SetStereo(kTRUE);

   if (fEveFrame == 0)
      PreUndock();

   return v;
}

//______________________________________________________________________________
TGLEmbeddedViewer* TEveViewer::SpawnGLEmbeddedViewer(TGedEditor* ged, Int_t border)
{
   // Spawn new GLViewer and adopt it.

   static const TEveException kEH("TEveViewer::SpawnGLEmbeddedViewer ");

   TGCompositeFrame* cf = GetGUICompositeFrame();

   TGLEmbeddedViewer* v = new TGLEmbeddedViewer(cf, 0, ged, border);
   SetGLViewer(v, v->GetFrame());

   cf->AddFrame(fGLViewerFrame, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY));

   fGLViewerFrame->MapWindow();

   if (fEveFrame == 0)
      PreUndock();

   return v;
}

//______________________________________________________________________________
void TEveViewer::Redraw(Bool_t resetCameras)
{
   // Redraw viewer immediately.

   if (resetCameras) fGLViewer->PostSceneBuildSetup(kTRUE);
   fGLViewer->RequestDraw(TGLRnrCtx::kLODHigh);
}

//______________________________________________________________________________
void TEveViewer::SwitchStereo()
{
   // Switch stereo mode.
   // This only works TGLSAViewers and, of course, with stereo support
   // provided by the OpenGL driver.

   TGLSAViewer *v = dynamic_cast<TGLSAViewer*>(fGLViewer);

   if (!v) {
      Warning("SwitchStereo", "Only supported for TGLSAViewer.");
      return;
   }

   v->DestroyGLWidget();
   TGLFormat *f = v->GetFormat();
switch_stereo:
   f->SetStereo(!f->IsStereo());
   v->SetStereo(f->IsStereo());
   try
   {
      v->CreateGLWidget();
   }
   catch (std::exception&)
   {
      Error("SwitchStereo", "Insufficient support from the graphics hardware. Reverting.");
      goto switch_stereo;
   }
}

/******************************************************************************/

//______________________________________________________________________________
void TEveViewer::AddScene(TEveScene* scene)
{
   // Add 'scene' to the list of scenes.

   static const TEveException eh("TEveViewer::AddScene ");

   TGLSceneInfo* glsi = fGLViewer->AddScene(scene->GetGLScene());
   if (glsi != 0) {
      TEveSceneInfo* si = new TEveSceneInfo(this, scene, glsi);
      AddElement(si);
   } else {
      throw(eh + "scene already in the viewer.");
   }
}

//______________________________________________________________________________
void TEveViewer::RemoveElementLocal(TEveElement* el)
{
   // Remove element 'el' from the list of children and also remove
   // appropriate GLScene from GLViewer's list of scenes.
   // Virtual from TEveElement.

   fGLViewer->RemoveScene(((TEveSceneInfo*)el)->GetGLScene());
}

//______________________________________________________________________________
void TEveViewer::RemoveElementsLocal()
{
   // Remove all children, forwarded to GLViewer.
   // Virtual from TEveElement.

   fGLViewer->RemoveAllScenes();
}

//______________________________________________________________________________
TObject* TEveViewer::GetEditorObject(const TEveException& eh) const
{
   // Object to be edited when this is selected, returns the TGLViewer.
   // Virtual from TEveElement.

   if (!fGLViewer)
      throw(eh + "fGLViewer not set.");
   return fGLViewer;
}

//______________________________________________________________________________
Bool_t TEveViewer::HandleElementPaste(TEveElement* el)
{
   // Receive a pasted object. TEveViewer only accepts objects of
   // class TEveScene.
   // Virtual from TEveElement.

   static const TEveException eh("TEveViewer::HandleElementPaste ");

   TEveScene* scene = dynamic_cast<TEveScene*>(el);
   if (scene != 0) {
      AddScene(scene);
      return kTRUE;
   } else {
      Warning(eh.Data(), "class TEveViewer only accepts TEveScene paste argument.");
      return kFALSE;
   }
}


/******************************************************************************/
/******************************************************************************/
// TEveViewerList
/******************************************************************************/

//______________________________________________________________________________
//
// List of Viewers providing common operations on TEveViewer collections.

ClassImp(TEveViewerList);

//______________________________________________________________________________
TEveViewerList::TEveViewerList(const char* n, const char* t) :
   TEveElementList(n, t),
   fShowTooltip   (kTRUE),

   fBrightness(0),
   fUseLightColorSet(kFALSE)
{
   // Constructor.

   SetChildClass(TEveViewer::Class());
   Connect();
}

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

   Disconnect();
}

//==============================================================================

//______________________________________________________________________________
void TEveViewerList::AddElement(TEveElement* el)
{
   // Call base-class implementation.
   // If compund is open and compound of the new element is not set,
   // the el's compound is set to this.

   TEveElementList::AddElement(el);
   el->IncParentIgnoreCnt();
}

//______________________________________________________________________________
void TEveViewerList::RemoveElementLocal(TEveElement* el)
{
   // Decompoundofy el, call base-class version.

   el->DecParentIgnoreCnt();
   TEveElementList::RemoveElementLocal(el);
}

//______________________________________________________________________________
void TEveViewerList::RemoveElementsLocal()
{
   // Decompoundofy children, call base-class version.

   for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
   {
      (*i)->DecParentIgnoreCnt();
   }

   TEveElementList::RemoveElementsLocal();
}

//==============================================================================

//______________________________________________________________________________
void TEveViewerList::Connect()
{
   // Connect to TGLViewer class-signals.

   TQObject::Connect("TGLViewer", "MouseOver(TObject*,UInt_t)",
                     "TEveViewerList", this, "OnMouseOver(TObject*,UInt_t)");

   TQObject::Connect("TGLViewer", "ReMouseOver(TObject*,UInt_t)",
                     "TEveViewerList", this, "OnReMouseOver(TObject*,UInt_t)");

   TQObject::Connect("TGLViewer", "UnMouseOver(TObject*,UInt_t)",
                     "TEveViewerList", this, "OnUnMouseOver(TObject*,UInt_t)");

   TQObject::Connect("TGLViewer", "Clicked(TObject*,UInt_t,UInt_t)",
                     "TEveViewerList", this, "OnClicked(TObject*,UInt_t,UInt_t)");

   TQObject::Connect("TGLViewer", "ReClicked(TObject*,UInt_t,UInt_t)",
                     "TEveViewerList", this, "OnReClicked(TObject*,UInt_t,UInt_t)");

   TQObject::Connect("TGLViewer", "UnClicked(TObject*,UInt_t,UInt_t)",
                     "TEveViewerList", this, "OnUnClicked(TObject*,UInt_t,UInt_t)");
}

//______________________________________________________________________________
void TEveViewerList::Disconnect()
{
   // Disconnect from TGLViewer class-signals.

   TQObject::Disconnect("TGLViewer", "MouseOver(TObject*,UInt_t)",
                        this, "OnMouseOver(TObject*,UInt_t)");

   TQObject::Disconnect("TGLViewer", "ReMouseOver(TObject*,UInt_t)",
                        this, "OnReMouseOver(TObject*,UInt_t)");

   TQObject::Disconnect("TGLViewer", "UnMouseOver(TObject*,UInt_t)",
                        this, "OnUnMouseOver(TObject*,UInt_t)");

   TQObject::Disconnect("TGLViewer", "Clicked(TObject*,UInt_t,UInt_t)",
                        this, "OnClicked(TObject*,UInt_t,UInt_t)");

   TQObject::Disconnect("TGLViewer", "ReClicked(TObject*,UInt_t,UInt_t)",
                        this, "OnReClicked(TObject*,UInt_t,UInt_t)");

   TQObject::Disconnect("TGLViewer", "UnClicked(TObject*,UInt_t,UInt_t)",
                        this, "OnUnClicked(TObject*,UInt_t,UInt_t)");
}

/******************************************************************************/

//______________________________________________________________________________
void TEveViewerList::RepaintChangedViewers(Bool_t resetCameras, Bool_t dropLogicals)
{
   // Repaint viewers that are tagged as changed.

   for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
   {
      TGLViewer* glv = ((TEveViewer*)*i)->GetGLViewer();
      if (glv->IsChanged())
      {
         // printf(" TEveViewer '%s' changed ... reqesting draw.\n", (*i)->GetObject()->GetName());

         if (resetCameras) glv->PostSceneBuildSetup(kTRUE);
         if (dropLogicals) glv->SetSmartRefresh(kFALSE);

         glv->RequestDraw(TGLRnrCtx::kLODHigh);

         if (dropLogicals) glv->SetSmartRefresh(kTRUE);
      }
   }
}

//______________________________________________________________________________
void TEveViewerList::RepaintAllViewers(Bool_t resetCameras, Bool_t dropLogicals)
{
   // Repaint all viewers.

   for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
   {
      TGLViewer* glv = ((TEveViewer*)*i)->GetGLViewer();

      // printf(" TEveViewer '%s' sending redraw reqest.\n", (*i)->GetObject()->GetName());

      if (resetCameras) glv->PostSceneBuildSetup(kTRUE);
      if (dropLogicals) glv->SetSmartRefresh(kFALSE);

      glv->RequestDraw(TGLRnrCtx::kLODHigh);

      if (dropLogicals) glv->SetSmartRefresh(kTRUE);
   }
}

//______________________________________________________________________________
void TEveViewerList::DeleteAnnotations()
{
   // Delete annotations from all viewers.

   for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
   {
      TGLViewer* glv = ((TEveViewer*)*i)->GetGLViewer();
      glv->DeleteOverlayAnnotations();
   }
}

/******************************************************************************/

//______________________________________________________________________________
void TEveViewerList::SceneDestructing(TEveScene* scene)
{
   // Callback done from a TEveScene destructor allowing proper
   // removal of the scene from affected viewers.

   for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
   {
      TEveViewer* viewer = (TEveViewer*) *i;
      List_i j = viewer->BeginChildren();
      while (j != viewer->EndChildren())
      {
         TEveSceneInfo* sinfo = (TEveSceneInfo*) *j;
         ++j;
         if (sinfo->GetScene() == scene)
            viewer->RemoveElement(sinfo);
      }
   }
}


/******************************************************************************/
// Processing of events from TGLViewers.
/******************************************************************************/

//______________________________________________________________________________
void TEveViewerList::HandleTooltip()
{
   // Show / hide tooltip for various MouseOver events.
   // Must be called from slots where sender is TGLEventHandler.

   if (fShowTooltip)
   {
      TGLViewer       *glw = dynamic_cast<TGLViewer*>((TQObject*) gTQSender);
      TGLEventHandler *glh = (TGLEventHandler*) glw->GetEventHandler();
      if (gEve->GetHighlight()->NumChildren() == 1)
      {
         TString title(gEve->GetHighlight()->FirstChild()->GetHighlightTooltip());
         if ( ! title.IsNull())
            glh->TriggerTooltip(title);
      }
      else
      {
         glh->RemoveTooltip();
      }
   }
}

//______________________________________________________________________________
void TEveViewerList::OnMouseOver(TObject *obj, UInt_t /*state*/)
{
   // Slot for global TGLViewer::MouseOver() signal.
   //
   // The attempt is made to determine the TEveElement being
   // represented by the physical shape and global higlight is updated
   // accordingly.
   //
   // If TEveElement::IsPickable() returns false, the element is not
   // highlighted.
   //
   // Highlight is always in single-selection mode.

   TEveElement *el = dynamic_cast<TEveElement*>(obj);
   if (el && !el->IsPickable())
      el = 0;

   void *qsender = gTQSender;
   gEve->GetHighlight()->UserPickedElement(el, kFALSE);
   gTQSender = qsender;

   HandleTooltip();
}

//______________________________________________________________________________
void TEveViewerList::OnReMouseOver(TObject *obj, UInt_t /*state*/)
{
   // Slot for global TGLViewer::ReMouseOver().
   //
   // The obj is dyn-casted to the TEveElement and global selection is
   // updated accordingly.
   //
   // If TEveElement::IsPickable() returns false, the element is not
   // selected.

   TEveElement* el = dynamic_cast<TEveElement*>(obj);
   if (el && !el->IsPickable())
      el = 0;

   void *qsender = gTQSender;
   gEve->GetHighlight()->UserRePickedElement(el);
   gTQSender = qsender;

   HandleTooltip();
}

//______________________________________________________________________________
void TEveViewerList::OnUnMouseOver(TObject *obj, UInt_t /*state*/)
{
   // Slot for global TGLViewer::UnMouseOver().
   //
   // The obj is dyn-casted to the TEveElement and global selection is
   // updated accordingly.
   //
   // If TEveElement::IsPickable() returns false, the element is not
   // selected.

   TEveElement* el = dynamic_cast<TEveElement*>(obj);
   if (el && !el->IsPickable())
      el = 0;

   void *qsender = gTQSender;
   gEve->GetHighlight()->UserUnPickedElement(el);
   gTQSender = qsender;

   HandleTooltip();
}

//______________________________________________________________________________
void TEveViewerList::OnClicked(TObject *obj, UInt_t /*button*/, UInt_t state)
{
   // Slot for global TGLViewer::Clicked().
   //
   // The obj is dyn-casted to the TEveElement and global selection is
   // updated accordingly.
   //
   // If TEveElement::IsPickable() returns false, the element is not
   // selected.

   TEveElement* el = dynamic_cast<TEveElement*>(obj);
   if (el && !el->IsPickable())
      el = 0;
   gEve->GetSelection()->UserPickedElement(el, state & kKeyControlMask);
}

//______________________________________________________________________________
void TEveViewerList::OnReClicked(TObject *obj, UInt_t /*button*/, UInt_t /*state*/)
{
   // Slot for global TGLViewer::ReClicked().
   //
   // The obj is dyn-casted to the TEveElement and global selection is
   // updated accordingly.
   //
   // If TEveElement::IsPickable() returns false, the element is not
   // selected.

   TEveElement* el = dynamic_cast<TEveElement*>(obj);
   if (el && !el->IsPickable())
      el = 0;
   gEve->GetSelection()->UserRePickedElement(el);
}

//______________________________________________________________________________
void TEveViewerList::OnUnClicked(TObject *obj, UInt_t /*button*/, UInt_t /*state*/)
{
   // Slot for global TGLViewer::UnClicked().
   //
   // The obj is dyn-casted to the TEveElement and global selection is
   // updated accordingly.
   //
   // If TEveElement::IsPickable() returns false, the element is not
   // selected.

   TEveElement* el = dynamic_cast<TEveElement*>(obj);
   if (el && !el->IsPickable())
      el = 0;
   gEve->GetSelection()->UserUnPickedElement(el);
}

//______________________________________________________________________________
void TEveViewerList::SetColorBrightness(Float_t b)
{
   // Set color brightness.

   TEveUtil::SetColorBrightness(b, 1);
}

//______________________________________________________________________________
void TEveViewerList::SwitchColorSet()
{
   // Switch background color.

   fUseLightColorSet = ! fUseLightColorSet;
   for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
   {
      TGLViewer* glv = ((TEveViewer*)*i)->GetGLViewer();
      if ( fUseLightColorSet)
         glv->UseLightColorSet();
      else
         glv->UseDarkColorSet();

      glv->RequestDraw(TGLRnrCtx::kLODHigh);
   }
}
 TEveViewer.cxx:1
 TEveViewer.cxx:2
 TEveViewer.cxx:3
 TEveViewer.cxx:4
 TEveViewer.cxx:5
 TEveViewer.cxx:6
 TEveViewer.cxx:7
 TEveViewer.cxx:8
 TEveViewer.cxx:9
 TEveViewer.cxx:10
 TEveViewer.cxx:11
 TEveViewer.cxx:12
 TEveViewer.cxx:13
 TEveViewer.cxx:14
 TEveViewer.cxx:15
 TEveViewer.cxx:16
 TEveViewer.cxx:17
 TEveViewer.cxx:18
 TEveViewer.cxx:19
 TEveViewer.cxx:20
 TEveViewer.cxx:21
 TEveViewer.cxx:22
 TEveViewer.cxx:23
 TEveViewer.cxx:24
 TEveViewer.cxx:25
 TEveViewer.cxx:26
 TEveViewer.cxx:27
 TEveViewer.cxx:28
 TEveViewer.cxx:29
 TEveViewer.cxx:30
 TEveViewer.cxx:31
 TEveViewer.cxx:32
 TEveViewer.cxx:33
 TEveViewer.cxx:34
 TEveViewer.cxx:35
 TEveViewer.cxx:36
 TEveViewer.cxx:37
 TEveViewer.cxx:38
 TEveViewer.cxx:39
 TEveViewer.cxx:40
 TEveViewer.cxx:41
 TEveViewer.cxx:42
 TEveViewer.cxx:43
 TEveViewer.cxx:44
 TEveViewer.cxx:45
 TEveViewer.cxx:46
 TEveViewer.cxx:47
 TEveViewer.cxx:48
 TEveViewer.cxx:49
 TEveViewer.cxx:50
 TEveViewer.cxx:51
 TEveViewer.cxx:52
 TEveViewer.cxx:53
 TEveViewer.cxx:54
 TEveViewer.cxx:55
 TEveViewer.cxx:56
 TEveViewer.cxx:57
 TEveViewer.cxx:58
 TEveViewer.cxx:59
 TEveViewer.cxx:60
 TEveViewer.cxx:61
 TEveViewer.cxx:62
 TEveViewer.cxx:63
 TEveViewer.cxx:64
 TEveViewer.cxx:65
 TEveViewer.cxx:66
 TEveViewer.cxx:67
 TEveViewer.cxx:68
 TEveViewer.cxx:69
 TEveViewer.cxx:70
 TEveViewer.cxx:71
 TEveViewer.cxx:72
 TEveViewer.cxx:73
 TEveViewer.cxx:74
 TEveViewer.cxx:75
 TEveViewer.cxx:76
 TEveViewer.cxx:77
 TEveViewer.cxx:78
 TEveViewer.cxx:79
 TEveViewer.cxx:80
 TEveViewer.cxx:81
 TEveViewer.cxx:82
 TEveViewer.cxx:83
 TEveViewer.cxx:84
 TEveViewer.cxx:85
 TEveViewer.cxx:86
 TEveViewer.cxx:87
 TEveViewer.cxx:88
 TEveViewer.cxx:89
 TEveViewer.cxx:90
 TEveViewer.cxx:91
 TEveViewer.cxx:92
 TEveViewer.cxx:93
 TEveViewer.cxx:94
 TEveViewer.cxx:95
 TEveViewer.cxx:96
 TEveViewer.cxx:97
 TEveViewer.cxx:98
 TEveViewer.cxx:99
 TEveViewer.cxx:100
 TEveViewer.cxx:101
 TEveViewer.cxx:102
 TEveViewer.cxx:103
 TEveViewer.cxx:104
 TEveViewer.cxx:105
 TEveViewer.cxx:106
 TEveViewer.cxx:107
 TEveViewer.cxx:108
 TEveViewer.cxx:109
 TEveViewer.cxx:110
 TEveViewer.cxx:111
 TEveViewer.cxx:112
 TEveViewer.cxx:113
 TEveViewer.cxx:114
 TEveViewer.cxx:115
 TEveViewer.cxx:116
 TEveViewer.cxx:117
 TEveViewer.cxx:118
 TEveViewer.cxx:119
 TEveViewer.cxx:120
 TEveViewer.cxx:121
 TEveViewer.cxx:122
 TEveViewer.cxx:123
 TEveViewer.cxx:124
 TEveViewer.cxx:125
 TEveViewer.cxx:126
 TEveViewer.cxx:127
 TEveViewer.cxx:128
 TEveViewer.cxx:129
 TEveViewer.cxx:130
 TEveViewer.cxx:131
 TEveViewer.cxx:132
 TEveViewer.cxx:133
 TEveViewer.cxx:134
 TEveViewer.cxx:135
 TEveViewer.cxx:136
 TEveViewer.cxx:137
 TEveViewer.cxx:138
 TEveViewer.cxx:139
 TEveViewer.cxx:140
 TEveViewer.cxx:141
 TEveViewer.cxx:142
 TEveViewer.cxx:143
 TEveViewer.cxx:144
 TEveViewer.cxx:145
 TEveViewer.cxx:146
 TEveViewer.cxx:147
 TEveViewer.cxx:148
 TEveViewer.cxx:149
 TEveViewer.cxx:150
 TEveViewer.cxx:151
 TEveViewer.cxx:152
 TEveViewer.cxx:153
 TEveViewer.cxx:154
 TEveViewer.cxx:155
 TEveViewer.cxx:156
 TEveViewer.cxx:157
 TEveViewer.cxx:158
 TEveViewer.cxx:159
 TEveViewer.cxx:160
 TEveViewer.cxx:161
 TEveViewer.cxx:162
 TEveViewer.cxx:163
 TEveViewer.cxx:164
 TEveViewer.cxx:165
 TEveViewer.cxx:166
 TEveViewer.cxx:167
 TEveViewer.cxx:168
 TEveViewer.cxx:169
 TEveViewer.cxx:170
 TEveViewer.cxx:171
 TEveViewer.cxx:172
 TEveViewer.cxx:173
 TEveViewer.cxx:174
 TEveViewer.cxx:175
 TEveViewer.cxx:176
 TEveViewer.cxx:177
 TEveViewer.cxx:178
 TEveViewer.cxx:179
 TEveViewer.cxx:180
 TEveViewer.cxx:181
 TEveViewer.cxx:182
 TEveViewer.cxx:183
 TEveViewer.cxx:184
 TEveViewer.cxx:185
 TEveViewer.cxx:186
 TEveViewer.cxx:187
 TEveViewer.cxx:188
 TEveViewer.cxx:189
 TEveViewer.cxx:190
 TEveViewer.cxx:191
 TEveViewer.cxx:192
 TEveViewer.cxx:193
 TEveViewer.cxx:194
 TEveViewer.cxx:195
 TEveViewer.cxx:196
 TEveViewer.cxx:197
 TEveViewer.cxx:198
 TEveViewer.cxx:199
 TEveViewer.cxx:200
 TEveViewer.cxx:201
 TEveViewer.cxx:202
 TEveViewer.cxx:203
 TEveViewer.cxx:204
 TEveViewer.cxx:205
 TEveViewer.cxx:206
 TEveViewer.cxx:207
 TEveViewer.cxx:208
 TEveViewer.cxx:209
 TEveViewer.cxx:210
 TEveViewer.cxx:211
 TEveViewer.cxx:212
 TEveViewer.cxx:213
 TEveViewer.cxx:214
 TEveViewer.cxx:215
 TEveViewer.cxx:216
 TEveViewer.cxx:217
 TEveViewer.cxx:218
 TEveViewer.cxx:219
 TEveViewer.cxx:220
 TEveViewer.cxx:221
 TEveViewer.cxx:222
 TEveViewer.cxx:223
 TEveViewer.cxx:224
 TEveViewer.cxx:225
 TEveViewer.cxx:226
 TEveViewer.cxx:227
 TEveViewer.cxx:228
 TEveViewer.cxx:229
 TEveViewer.cxx:230
 TEveViewer.cxx:231
 TEveViewer.cxx:232
 TEveViewer.cxx:233
 TEveViewer.cxx:234
 TEveViewer.cxx:235
 TEveViewer.cxx:236
 TEveViewer.cxx:237
 TEveViewer.cxx:238
 TEveViewer.cxx:239
 TEveViewer.cxx:240
 TEveViewer.cxx:241
 TEveViewer.cxx:242
 TEveViewer.cxx:243
 TEveViewer.cxx:244
 TEveViewer.cxx:245
 TEveViewer.cxx:246
 TEveViewer.cxx:247
 TEveViewer.cxx:248
 TEveViewer.cxx:249
 TEveViewer.cxx:250
 TEveViewer.cxx:251
 TEveViewer.cxx:252
 TEveViewer.cxx:253
 TEveViewer.cxx:254
 TEveViewer.cxx:255
 TEveViewer.cxx:256
 TEveViewer.cxx:257
 TEveViewer.cxx:258
 TEveViewer.cxx:259
 TEveViewer.cxx:260
 TEveViewer.cxx:261
 TEveViewer.cxx:262
 TEveViewer.cxx:263
 TEveViewer.cxx:264
 TEveViewer.cxx:265
 TEveViewer.cxx:266
 TEveViewer.cxx:267
 TEveViewer.cxx:268
 TEveViewer.cxx:269
 TEveViewer.cxx:270
 TEveViewer.cxx:271
 TEveViewer.cxx:272
 TEveViewer.cxx:273
 TEveViewer.cxx:274
 TEveViewer.cxx:275
 TEveViewer.cxx:276
 TEveViewer.cxx:277
 TEveViewer.cxx:278
 TEveViewer.cxx:279
 TEveViewer.cxx:280
 TEveViewer.cxx:281
 TEveViewer.cxx:282
 TEveViewer.cxx:283
 TEveViewer.cxx:284
 TEveViewer.cxx:285
 TEveViewer.cxx:286
 TEveViewer.cxx:287
 TEveViewer.cxx:288
 TEveViewer.cxx:289
 TEveViewer.cxx:290
 TEveViewer.cxx:291
 TEveViewer.cxx:292
 TEveViewer.cxx:293
 TEveViewer.cxx:294
 TEveViewer.cxx:295
 TEveViewer.cxx:296
 TEveViewer.cxx:297
 TEveViewer.cxx:298
 TEveViewer.cxx:299
 TEveViewer.cxx:300
 TEveViewer.cxx:301
 TEveViewer.cxx:302
 TEveViewer.cxx:303
 TEveViewer.cxx:304
 TEveViewer.cxx:305
 TEveViewer.cxx:306
 TEveViewer.cxx:307
 TEveViewer.cxx:308
 TEveViewer.cxx:309
 TEveViewer.cxx:310
 TEveViewer.cxx:311
 TEveViewer.cxx:312
 TEveViewer.cxx:313
 TEveViewer.cxx:314
 TEveViewer.cxx:315
 TEveViewer.cxx:316
 TEveViewer.cxx:317
 TEveViewer.cxx:318
 TEveViewer.cxx:319
 TEveViewer.cxx:320
 TEveViewer.cxx:321
 TEveViewer.cxx:322
 TEveViewer.cxx:323
 TEveViewer.cxx:324
 TEveViewer.cxx:325
 TEveViewer.cxx:326
 TEveViewer.cxx:327
 TEveViewer.cxx:328
 TEveViewer.cxx:329
 TEveViewer.cxx:330
 TEveViewer.cxx:331
 TEveViewer.cxx:332
 TEveViewer.cxx:333
 TEveViewer.cxx:334
 TEveViewer.cxx:335
 TEveViewer.cxx:336
 TEveViewer.cxx:337
 TEveViewer.cxx:338
 TEveViewer.cxx:339
 TEveViewer.cxx:340
 TEveViewer.cxx:341
 TEveViewer.cxx:342
 TEveViewer.cxx:343
 TEveViewer.cxx:344
 TEveViewer.cxx:345
 TEveViewer.cxx:346
 TEveViewer.cxx:347
 TEveViewer.cxx:348
 TEveViewer.cxx:349
 TEveViewer.cxx:350
 TEveViewer.cxx:351
 TEveViewer.cxx:352
 TEveViewer.cxx:353
 TEveViewer.cxx:354
 TEveViewer.cxx:355
 TEveViewer.cxx:356
 TEveViewer.cxx:357
 TEveViewer.cxx:358
 TEveViewer.cxx:359
 TEveViewer.cxx:360
 TEveViewer.cxx:361
 TEveViewer.cxx:362
 TEveViewer.cxx:363
 TEveViewer.cxx:364
 TEveViewer.cxx:365
 TEveViewer.cxx:366
 TEveViewer.cxx:367
 TEveViewer.cxx:368
 TEveViewer.cxx:369
 TEveViewer.cxx:370
 TEveViewer.cxx:371
 TEveViewer.cxx:372
 TEveViewer.cxx:373
 TEveViewer.cxx:374
 TEveViewer.cxx:375
 TEveViewer.cxx:376
 TEveViewer.cxx:377
 TEveViewer.cxx:378
 TEveViewer.cxx:379
 TEveViewer.cxx:380
 TEveViewer.cxx:381
 TEveViewer.cxx:382
 TEveViewer.cxx:383
 TEveViewer.cxx:384
 TEveViewer.cxx:385
 TEveViewer.cxx:386
 TEveViewer.cxx:387
 TEveViewer.cxx:388
 TEveViewer.cxx:389
 TEveViewer.cxx:390
 TEveViewer.cxx:391
 TEveViewer.cxx:392
 TEveViewer.cxx:393
 TEveViewer.cxx:394
 TEveViewer.cxx:395
 TEveViewer.cxx:396
 TEveViewer.cxx:397
 TEveViewer.cxx:398
 TEveViewer.cxx:399
 TEveViewer.cxx:400
 TEveViewer.cxx:401
 TEveViewer.cxx:402
 TEveViewer.cxx:403
 TEveViewer.cxx:404
 TEveViewer.cxx:405
 TEveViewer.cxx:406
 TEveViewer.cxx:407
 TEveViewer.cxx:408
 TEveViewer.cxx:409
 TEveViewer.cxx:410
 TEveViewer.cxx:411
 TEveViewer.cxx:412
 TEveViewer.cxx:413
 TEveViewer.cxx:414
 TEveViewer.cxx:415
 TEveViewer.cxx:416
 TEveViewer.cxx:417
 TEveViewer.cxx:418
 TEveViewer.cxx:419
 TEveViewer.cxx:420
 TEveViewer.cxx:421
 TEveViewer.cxx:422
 TEveViewer.cxx:423
 TEveViewer.cxx:424
 TEveViewer.cxx:425
 TEveViewer.cxx:426
 TEveViewer.cxx:427
 TEveViewer.cxx:428
 TEveViewer.cxx:429
 TEveViewer.cxx:430
 TEveViewer.cxx:431
 TEveViewer.cxx:432
 TEveViewer.cxx:433
 TEveViewer.cxx:434
 TEveViewer.cxx:435
 TEveViewer.cxx:436
 TEveViewer.cxx:437
 TEveViewer.cxx:438
 TEveViewer.cxx:439
 TEveViewer.cxx:440
 TEveViewer.cxx:441
 TEveViewer.cxx:442
 TEveViewer.cxx:443
 TEveViewer.cxx:444
 TEveViewer.cxx:445
 TEveViewer.cxx:446
 TEveViewer.cxx:447
 TEveViewer.cxx:448
 TEveViewer.cxx:449
 TEveViewer.cxx:450
 TEveViewer.cxx:451
 TEveViewer.cxx:452
 TEveViewer.cxx:453
 TEveViewer.cxx:454
 TEveViewer.cxx:455
 TEveViewer.cxx:456
 TEveViewer.cxx:457
 TEveViewer.cxx:458
 TEveViewer.cxx:459
 TEveViewer.cxx:460
 TEveViewer.cxx:461
 TEveViewer.cxx:462
 TEveViewer.cxx:463
 TEveViewer.cxx:464
 TEveViewer.cxx:465
 TEveViewer.cxx:466
 TEveViewer.cxx:467
 TEveViewer.cxx:468
 TEveViewer.cxx:469
 TEveViewer.cxx:470
 TEveViewer.cxx:471
 TEveViewer.cxx:472
 TEveViewer.cxx:473
 TEveViewer.cxx:474
 TEveViewer.cxx:475
 TEveViewer.cxx:476
 TEveViewer.cxx:477
 TEveViewer.cxx:478
 TEveViewer.cxx:479
 TEveViewer.cxx:480
 TEveViewer.cxx:481
 TEveViewer.cxx:482
 TEveViewer.cxx:483
 TEveViewer.cxx:484
 TEveViewer.cxx:485
 TEveViewer.cxx:486
 TEveViewer.cxx:487
 TEveViewer.cxx:488
 TEveViewer.cxx:489
 TEveViewer.cxx:490
 TEveViewer.cxx:491
 TEveViewer.cxx:492
 TEveViewer.cxx:493
 TEveViewer.cxx:494
 TEveViewer.cxx:495
 TEveViewer.cxx:496
 TEveViewer.cxx:497
 TEveViewer.cxx:498
 TEveViewer.cxx:499
 TEveViewer.cxx:500
 TEveViewer.cxx:501
 TEveViewer.cxx:502
 TEveViewer.cxx:503
 TEveViewer.cxx:504
 TEveViewer.cxx:505
 TEveViewer.cxx:506
 TEveViewer.cxx:507
 TEveViewer.cxx:508
 TEveViewer.cxx:509
 TEveViewer.cxx:510
 TEveViewer.cxx:511
 TEveViewer.cxx:512
 TEveViewer.cxx:513
 TEveViewer.cxx:514
 TEveViewer.cxx:515
 TEveViewer.cxx:516
 TEveViewer.cxx:517
 TEveViewer.cxx:518
 TEveViewer.cxx:519
 TEveViewer.cxx:520
 TEveViewer.cxx:521
 TEveViewer.cxx:522
 TEveViewer.cxx:523
 TEveViewer.cxx:524
 TEveViewer.cxx:525
 TEveViewer.cxx:526
 TEveViewer.cxx:527
 TEveViewer.cxx:528
 TEveViewer.cxx:529
 TEveViewer.cxx:530
 TEveViewer.cxx:531
 TEveViewer.cxx:532
 TEveViewer.cxx:533
 TEveViewer.cxx:534
 TEveViewer.cxx:535
 TEveViewer.cxx:536
 TEveViewer.cxx:537
 TEveViewer.cxx:538
 TEveViewer.cxx:539
 TEveViewer.cxx:540
 TEveViewer.cxx:541
 TEveViewer.cxx:542
 TEveViewer.cxx:543
 TEveViewer.cxx:544
 TEveViewer.cxx:545
 TEveViewer.cxx:546
 TEveViewer.cxx:547
 TEveViewer.cxx:548
 TEveViewer.cxx:549
 TEveViewer.cxx:550
 TEveViewer.cxx:551
 TEveViewer.cxx:552
 TEveViewer.cxx:553
 TEveViewer.cxx:554
 TEveViewer.cxx:555
 TEveViewer.cxx:556
 TEveViewer.cxx:557
 TEveViewer.cxx:558
 TEveViewer.cxx:559
 TEveViewer.cxx:560
 TEveViewer.cxx:561
 TEveViewer.cxx:562
 TEveViewer.cxx:563
 TEveViewer.cxx:564
 TEveViewer.cxx:565
 TEveViewer.cxx:566
 TEveViewer.cxx:567
 TEveViewer.cxx:568
 TEveViewer.cxx:569
 TEveViewer.cxx:570
 TEveViewer.cxx:571
 TEveViewer.cxx:572
 TEveViewer.cxx:573
 TEveViewer.cxx:574
 TEveViewer.cxx:575
 TEveViewer.cxx:576
 TEveViewer.cxx:577
 TEveViewer.cxx:578
 TEveViewer.cxx:579
 TEveViewer.cxx:580
 TEveViewer.cxx:581
 TEveViewer.cxx:582
 TEveViewer.cxx:583
 TEveViewer.cxx:584
 TEveViewer.cxx:585
 TEveViewer.cxx:586
 TEveViewer.cxx:587
 TEveViewer.cxx:588
 TEveViewer.cxx:589
 TEveViewer.cxx:590
 TEveViewer.cxx:591
 TEveViewer.cxx:592
 TEveViewer.cxx:593
 TEveViewer.cxx:594
 TEveViewer.cxx:595
 TEveViewer.cxx:596
 TEveViewer.cxx:597
 TEveViewer.cxx:598
 TEveViewer.cxx:599
 TEveViewer.cxx:600
 TEveViewer.cxx:601
 TEveViewer.cxx:602
 TEveViewer.cxx:603
 TEveViewer.cxx:604
 TEveViewer.cxx:605
 TEveViewer.cxx:606
 TEveViewer.cxx:607
 TEveViewer.cxx:608
 TEveViewer.cxx:609
 TEveViewer.cxx:610
 TEveViewer.cxx:611
 TEveViewer.cxx:612
 TEveViewer.cxx:613
 TEveViewer.cxx:614
 TEveViewer.cxx:615
 TEveViewer.cxx:616
 TEveViewer.cxx:617
 TEveViewer.cxx:618
 TEveViewer.cxx:619
 TEveViewer.cxx:620
 TEveViewer.cxx:621
 TEveViewer.cxx:622
 TEveViewer.cxx:623
 TEveViewer.cxx:624
 TEveViewer.cxx:625
 TEveViewer.cxx:626
 TEveViewer.cxx:627
 TEveViewer.cxx:628
 TEveViewer.cxx:629
 TEveViewer.cxx:630
 TEveViewer.cxx:631
 TEveViewer.cxx:632
 TEveViewer.cxx:633
 TEveViewer.cxx:634
 TEveViewer.cxx:635
 TEveViewer.cxx:636
 TEveViewer.cxx:637
 TEveViewer.cxx:638
 TEveViewer.cxx:639
 TEveViewer.cxx:640
 TEveViewer.cxx:641
 TEveViewer.cxx:642
 TEveViewer.cxx:643
 TEveViewer.cxx:644
 TEveViewer.cxx:645
 TEveViewer.cxx:646
 TEveViewer.cxx:647
 TEveViewer.cxx:648
 TEveViewer.cxx:649
 TEveViewer.cxx:650
 TEveViewer.cxx:651
 TEveViewer.cxx:652
 TEveViewer.cxx:653
 TEveViewer.cxx:654
 TEveViewer.cxx:655
 TEveViewer.cxx:656
 TEveViewer.cxx:657
 TEveViewer.cxx:658
 TEveViewer.cxx:659
 TEveViewer.cxx:660
 TEveViewer.cxx:661
 TEveViewer.cxx:662
 TEveViewer.cxx:663
 TEveViewer.cxx:664
 TEveViewer.cxx:665
 TEveViewer.cxx:666
 TEveViewer.cxx:667
 TEveViewer.cxx:668
 TEveViewer.cxx:669
 TEveViewer.cxx:670
 TEveViewer.cxx:671
 TEveViewer.cxx:672
 TEveViewer.cxx:673
 TEveViewer.cxx:674
 TEveViewer.cxx:675
 TEveViewer.cxx:676
 TEveViewer.cxx:677
 TEveViewer.cxx:678
 TEveViewer.cxx:679
 TEveViewer.cxx:680
 TEveViewer.cxx:681
 TEveViewer.cxx:682
 TEveViewer.cxx:683
 TEveViewer.cxx:684
 TEveViewer.cxx:685
 TEveViewer.cxx:686
 TEveViewer.cxx:687
 TEveViewer.cxx:688
 TEveViewer.cxx:689
 TEveViewer.cxx:690
 TEveViewer.cxx:691
 TEveViewer.cxx:692
 TEveViewer.cxx:693
 TEveViewer.cxx:694
 TEveViewer.cxx:695
 TEveViewer.cxx:696
 TEveViewer.cxx:697
 TEveViewer.cxx:698
 TEveViewer.cxx:699