// @(#):$Id$
// Author: M.Gheata 

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
//  TGeoHypeEditor                                                      //
//                                                                      //
//////////////////////////////////////////////////////////////////////////
//Begin_Html
/*
<img src="gif/hype_pic.gif">
*/
//End_Html
//Begin_Html
/*
<img src="gif/hype_ed.jpg">
*/
//End_Html

#include "TGeoHypeEditor.h"
#include "TGeoTabManager.h"
#include "TGeoHype.h"
#include "TGeoManager.h"
#include "TVirtualGeoPainter.h"
#include "TPad.h"
#include "TView.h"
#include "TMath.h"
#include "TGTab.h"
#include "TGComboBox.h"
#include "TGButton.h"
#include "TGTextEntry.h"
#include "TGNumberEntry.h"
#include "TGLabel.h"

ClassImp(TGeoHypeEditor)

enum ETGeoHypeWid {
   kHYPE_NAME, kHYPE_RIN, kHYPE_ROUT,  kHYPE_DZ, kHYPE_STIN,
   kHYPE_STOUT, kHYPE_APPLY, kHYPE_UNDO
};

//______________________________________________________________________________
TGeoHypeEditor::TGeoHypeEditor(const TGWindow *p, Int_t width,
                                   Int_t height, UInt_t options, Pixel_t back)
   : TGeoGedFrame(p, width, height, options | kVerticalFrame, back)
{
   // Constructor for Hype editor
   fShape   = 0;
   fRini = fRouti = fStIni = fStOuti = 0.0;
   fNamei = "";
   fIsModified = kFALSE;
   fIsShapeEditable = kTRUE;

   // TextEntry for shape name
   MakeTitle("Name");
   fShapeName = new TGTextEntry(this, new TGTextBuffer(50), kHYPE_NAME);
   fShapeName->Resize(135, fShapeName->GetDefaultHeight());
   fShapeName->SetToolTipText("Enter the hyperboloid name");
   fShapeName->Associate(this);
   AddFrame(fShapeName, new TGLayoutHints(kLHintsLeft, 3, 1, 2, 5));

   TGTextEntry *nef;
   MakeTitle("Dimensions");
   // Number entry for Rin
   TGCompositeFrame *f1 = new TGCompositeFrame(this, 155, 10, kHorizontalFrame | kFixedWidth);
   f1->AddFrame(new TGLabel(f1, "Rin"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
   fERin = new TGNumberEntry(f1, 0., 5, kHYPE_RIN);
   fERin->SetNumAttr(TGNumberFormat::kNEAPositive);
   fERin->Resize(100, fERin->GetDefaultHeight());
   nef = (TGTextEntry*)fERin->GetNumberEntry();
   nef->SetToolTipText("Enter the  inner radius ");
   fERin->Associate(this);
   f1->AddFrame(fERin, new TGLayoutHints(kLHintsRight, 2, 2, 4, 4));
   AddFrame(f1, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));
   
   // Number entry for Rout
   f1 = new TGCompositeFrame(this, 155, 10, kHorizontalFrame | kFixedWidth);
   f1->AddFrame(new TGLabel(f1, "Rout"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
   fERout = new TGNumberEntry(f1, 0., 5, kHYPE_ROUT);
   fERout->SetNumAttr(TGNumberFormat::kNEAPositive);
   fERout->Resize(100, fERout->GetDefaultHeight());
   nef = (TGTextEntry*)fERout->GetNumberEntry();
   nef->SetToolTipText("Enter the outer radius");
   fERout->Associate(this);
   f1->AddFrame(fERout, new TGLayoutHints(kLHintsRight, 2, 2, 4, 4));
   AddFrame(f1, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));
   
   // Number entry for Dz
   f1 = new TGCompositeFrame(this, 155, 10, kHorizontalFrame | kFixedWidth);
   f1->AddFrame(new TGLabel(f1, "Dz"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
   fEDz = new TGNumberEntry(f1, 0., 5, kHYPE_DZ);
   fEDz->SetNumAttr(TGNumberFormat::kNEAPositive);
   fEDz->Resize(100, fEDz->GetDefaultHeight());
   nef = (TGTextEntry*)fEDz->GetNumberEntry();
   nef->SetToolTipText("Enter the half-lenth in Dz");
   fEDz->Associate(this);
   f1->AddFrame(fEDz, new TGLayoutHints(kLHintsRight, 2, 2, 4, 4));
   AddFrame(f1, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));
 
   // Number entry for StIn.
   f1 = new TGCompositeFrame(this, 155, 10, kHorizontalFrame | kFixedWidth);
   f1->AddFrame(new TGLabel(f1, "StIn"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
   fEStIn = new TGNumberEntry(f1, 0., 5, kHYPE_STIN);
   fEStIn->Resize(100, fEStIn->GetDefaultHeight());
   nef = (TGTextEntry*)fEStIn->GetNumberEntry();
   nef->SetToolTipText("Enter the stereo angle for inner surface");
   fEStIn->Associate(this);
   f1->AddFrame(fEStIn, new TGLayoutHints(kLHintsRight, 2, 2, 4, 4));
   AddFrame(f1, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));

   // Number entry for StOut.
   f1 = new TGCompositeFrame(this, 155, 10, kHorizontalFrame | kFixedWidth);
   f1->AddFrame(new TGLabel(f1, "StOut"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
   fEStOut = new TGNumberEntry(f1, 0., 5, kHYPE_STOUT);
   fEStOut->SetNumAttr(TGNumberFormat::kNEAPositive);
   fEStOut->Resize(100, fEStOut->GetDefaultHeight());
   nef = (TGTextEntry*)fEStOut->GetNumberEntry();
   nef->SetToolTipText("Enter the stereo angle for outer surface");
   fEStOut->Associate(this);
   f1->AddFrame(fEStOut, new TGLayoutHints(kLHintsRight, 2, 2, 4, 4));
   AddFrame(f1, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));

   // Delayed draw
   f1 = new TGCompositeFrame(this, 155, 10, kHorizontalFrame | kFixedWidth | kSunkenFrame);
   fDelayed = new TGCheckButton(f1, "Delayed draw");
   f1->AddFrame(fDelayed, new TGLayoutHints(kLHintsLeft , 2, 2, 4, 4));
   AddFrame(f1,  new TGLayoutHints(kLHintsLeft, 6, 6, 4, 4));  
   
   // Buttons
   f1 = new TGCompositeFrame(this, 155, 10, kHorizontalFrame | kFixedWidth);
   fApply = new TGTextButton(f1, "Apply");
   f1->AddFrame(fApply, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));
   fApply->Associate(this);
   fUndo = new TGTextButton(f1, "Undo");
   f1->AddFrame(fUndo, new TGLayoutHints(kLHintsRight , 2, 2, 4, 4));
   fUndo->Associate(this);
   AddFrame(f1,  new TGLayoutHints(kLHintsLeft, 6, 6, 4, 4));  
   fUndo->SetSize(fApply->GetSize());
}

//______________________________________________________________________________
TGeoHypeEditor::~TGeoHypeEditor()
{
// Destructor
   TGFrameElement *el;
   TIter next(GetList());
   while ((el = (TGFrameElement *)next())) {
      if (el->fFrame->IsComposite()) 
         TGeoTabManager::Cleanup((TGCompositeFrame*)el->fFrame);
   }
   Cleanup();   
}

//______________________________________________________________________________
void TGeoHypeEditor::ConnectSignals2Slots()
{
   // Connect signals to slots.
   fApply->Connect("Clicked()", "TGeoHypeEditor", this, "DoApply()");
   fUndo->Connect("Clicked()", "TGeoHypeEditor", this, "DoUndo()");
   fShapeName->Connect("TextChanged(const char *)", "TGeoHypeEditor", this, "DoModified()");
   fERin->Connect("ValueSet(Long_t)", "TGeoHypeEditor", this, "DoRin()");
   fERout->Connect("ValueSet(Long_t)", "TGeoHypeEditor", this, "DoRout()");
   fEDz->Connect("ValueSet(Long_t)", "TGeoHypeEditor", this, "DoDz()");
   fEStIn->Connect("ValueSet(Long_t)", "TGeoHypeEditor", this, "DoStIn()");
   fEStOut->Connect("ValueSet(Long_t)", "TGeoHypeEditor", this, "DoStOut()");
   fERin->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoHypeEditor", this, "DoModified()");
   fERout->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoHypeEditor", this, "DoModified()");
   fEDz->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoHypeEditor", this, "DoModified()");
   fEStIn->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoHypeEditor", this, "DoModified()");
   fEStOut->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoHypeEditor", this, "DoModified()");
   fInit = kFALSE;
}


//______________________________________________________________________________
void TGeoHypeEditor::SetModel(TObject* obj)
{
   // Connect to the selected object.
   if (obj == 0 || (obj->IsA()!=TGeoHype::Class())) {
      SetActive(kFALSE);
      return;                 
   } 
   fShape = (TGeoHype*)obj;
   fRini = fShape->GetRmin();
   fRouti = fShape->GetRmax();
   fDzi = fShape->GetDz();
   fStIni = fShape->GetStIn();
   fStOuti = fShape->GetStOut();
   const char *sname = fShape->GetName();
   if (!strcmp(sname, fShape->ClassName())) fShapeName->SetText("-no_name");
   else {
      fShapeName->SetText(sname);
      fNamei = sname;
   }   
   fERin->SetNumber(fRini);
   fERout->SetNumber(fRouti);
   fEDz->SetNumber(fDzi);
   fEStIn->SetNumber(fStIni);
   fEStOut->SetNumber(fStOuti);
   fApply->SetEnabled(kFALSE);
   fUndo->SetEnabled(kFALSE);
   
   if (fInit) ConnectSignals2Slots();
   SetActive();
}

//______________________________________________________________________________
Bool_t TGeoHypeEditor::IsDelayed() const
{
// Check if shape drawing is delayed.
   return (fDelayed->GetState() == kButtonDown);
}

//______________________________________________________________________________
void TGeoHypeEditor::DoName()
{
// Slot for name.
   DoModified();
}

//______________________________________________________________________________
void TGeoHypeEditor::DoApply()
{
// Slot for applying current settings.
   const char *name = fShapeName->GetText();
   if (strcmp(name,fShape->GetName())) fShape->SetName(name);
   Double_t rin = fERin->GetNumber();
   Double_t rout = fERout->GetNumber(); 
   Double_t dz = fEDz->GetNumber();
   Double_t stin = fEStIn->GetNumber();
   Double_t stout = fEStOut->GetNumber(); 
   Double_t tin = TMath::Tan(stin*TMath::DegToRad());
   Double_t tout = TMath::Tan(stout*TMath::DegToRad());
   if ((dz<=0) || (rin<0) || (rin>rout) || 
       (rin*rin+tin*tin*dz*dz > rout*rout+tout*tout*dz*dz)) {
      fUndo->SetEnabled();
      fApply->SetEnabled(kFALSE);
      return;
   }         
   Double_t param[5];
   param[0] = dz;
   param[1] = rin;
   param[2] = stin;
   param[3] = rout;
   param[4] = stout;
   fShape->SetDimensions(param);
   fShape->ComputeBBox();
   fUndo->SetEnabled();
   fApply->SetEnabled(kFALSE);
   if (fPad) {
      if (gGeoManager && gGeoManager->GetPainter() && gGeoManager->GetPainter()->IsPaintingShape()) {
         TView *view = fPad->GetView();
         if (!view) {
            fShape->Draw();
            fPad->GetView()->ShowAxis();
         } else {
            view->SetRange(-fShape->GetDX(), -fShape->GetDY(), -fShape->GetDZ(),
                           fShape->GetDX(), fShape->GetDY(), fShape->GetDZ());
            Update();
         }                  
      } else Update();
   }   
}

//______________________________________________________________________________
void TGeoHypeEditor::DoModified()
{
// Slot for notifying modifications.
   fApply->SetEnabled();
}

//______________________________________________________________________________
void TGeoHypeEditor::DoUndo()
{
// Slot for undoing last operation.
   fERin->SetNumber(fRini);
   fERout->SetNumber(fRouti);
   fEDz->SetNumber(fDzi);
   fEStIn->SetNumber(fStIni);
   fEStOut->SetNumber(fStOuti);
   DoApply();
   fUndo->SetEnabled(kFALSE);
   fApply->SetEnabled(kFALSE);
}
   
//______________________________________________________________________________
void TGeoHypeEditor::DoRin()
{
// Slot for Rin.
   Double_t rin = fERin->GetNumber();
   Double_t rout = fERout->GetNumber(); 
   Double_t dz = fEDz->GetNumber();
   Double_t stin = fEStIn->GetNumber();
   Double_t stout = fEStOut->GetNumber();
   Double_t tin = TMath::Tan(stin*TMath::DegToRad());
   Double_t tout = TMath::Tan(stout*TMath::DegToRad());
   if (rin<0) {
      rin = 0;
      fERin->SetNumber(rin);
   } 
   Double_t rinmax = TMath::Sqrt((rout*rout+tout*tout*dz*dz)/(tin*tin*dz*dz));
   rinmax = TMath::Min(rinmax, rout);
   if (rin > rinmax) { 
      rin = rinmax-1.e-6;
      fERin->SetNumber(rin);
   } 
   DoModified();
   if (!IsDelayed()) DoApply();
}

//______________________________________________________________________________
void TGeoHypeEditor::DoRout()
{
// Slot for Rout.
   Double_t rin = fERin->GetNumber();
   Double_t rout = fERout->GetNumber(); 
   Double_t dz = fEDz->GetNumber();
   Double_t stin = fEStIn->GetNumber();
   Double_t stout = fEStOut->GetNumber();
   Double_t tin = TMath::Tan(stin*TMath::DegToRad());
   Double_t tout = TMath::Tan(stout*TMath::DegToRad());
   Double_t routmin = TMath::Sqrt((rin*rin+tin*tin*dz*dz)/(tout*tout*dz*dz));
   routmin = TMath::Max(routmin,rin);
   if (rout < routmin) {
      rout = routmin+1.e-6;
      fERout->SetNumber(rout);
   }   
   DoModified();
   if (!IsDelayed()) DoApply();
}

//______________________________________________________________________________
void TGeoHypeEditor::DoDz()
{
// Slot for Z.
   Double_t rin = fERin->GetNumber();
   Double_t rout = fERout->GetNumber(); 
   Double_t dz = fEDz->GetNumber();
   Double_t stin = fEStIn->GetNumber();
   Double_t stout = fEStOut->GetNumber();
   if (TMath::Abs(stin-stout)<1.e-6) {
      stin = stout+1.;
      fEStIn->SetNumber(stin);
   }   
   Double_t tin = TMath::Tan(stin*TMath::DegToRad());
   Double_t tout = TMath::Tan(stout*TMath::DegToRad());
   if (dz<=0) {
      dz = 0.1;
      fEDz->SetNumber(dz);
   } 
   Double_t dzmax = TMath::Sqrt((rout*rout-rin*rin)/(tin*tin-tout*tout));
   if (dz>dzmax) {
      dz = dzmax;
      fEDz->SetNumber(dz);
   }     
   DoModified();
   if (!IsDelayed()) DoApply();
}

//______________________________________________________________________________
void TGeoHypeEditor::DoStIn()
{
// Slot for StIn.
   Double_t rin = fERin->GetNumber();
   Double_t rout = fERout->GetNumber(); 
   Double_t dz = fEDz->GetNumber();
   Double_t stin = fEStIn->GetNumber();
   Double_t stout = fEStOut->GetNumber();
   if (stin >= 90) {
      stin = 89.;
      fEStIn->SetNumber(stin);
   }   
   Double_t tin = TMath::Tan(stin*TMath::DegToRad());
   Double_t tout = TMath::Tan(stout*TMath::DegToRad());
   Double_t tinmax = TMath::Sqrt(tout*tout+(rout*rout-rin*rin)/(dz*dz));
   if (tin>tinmax) {
      tin = tinmax-1.e-6;
      stin = TMath::RadToDeg()*TMath::ATan(tin);
      fEStIn->SetNumber(stin);
   }   
   DoModified();
   if (!IsDelayed()) DoApply();
}

//______________________________________________________________________________
void TGeoHypeEditor::DoStOut()
{
// Slot for StOut.
   Double_t rin = fERin->GetNumber();
   Double_t rout = fERout->GetNumber(); 
   Double_t dz = fEDz->GetNumber();
   Double_t stin = fEStIn->GetNumber();
   Double_t stout = fEStOut->GetNumber();
   if (stout > 90) {
      stout = 89;
      fEStOut->SetNumber(stout);
   }   
   Double_t tin = TMath::Tan(stin*TMath::DegToRad());
   Double_t tout = TMath::Tan(stout*TMath::DegToRad());
   Double_t tinmin = TMath::Sqrt((rout*rout-rin*rin)/(dz*dz));
   if (tin < tinmin) {
      tin = tinmin;
      stin = TMath::RadToDeg()*TMath::ATan(tin);
      fEStIn->SetNumber(stin);
   }
   Double_t toutmin = TMath::Sqrt(tin*tin -tinmin*tinmin);
   if (tout < toutmin) {
      tout = toutmin+1.e-6;
      stout = TMath::RadToDeg()*TMath::ATan(tout);
      fEStOut->SetNumber(stout);
   }     
   DoModified();
   if (!IsDelayed()) DoApply();
}
 TGeoHypeEditor.cxx:1
 TGeoHypeEditor.cxx:2
 TGeoHypeEditor.cxx:3
 TGeoHypeEditor.cxx:4
 TGeoHypeEditor.cxx:5
 TGeoHypeEditor.cxx:6
 TGeoHypeEditor.cxx:7
 TGeoHypeEditor.cxx:8
 TGeoHypeEditor.cxx:9
 TGeoHypeEditor.cxx:10
 TGeoHypeEditor.cxx:11
 TGeoHypeEditor.cxx:12
 TGeoHypeEditor.cxx:13
 TGeoHypeEditor.cxx:14
 TGeoHypeEditor.cxx:15
 TGeoHypeEditor.cxx:16
 TGeoHypeEditor.cxx:17
 TGeoHypeEditor.cxx:18
 TGeoHypeEditor.cxx:19
 TGeoHypeEditor.cxx:20
 TGeoHypeEditor.cxx:21
 TGeoHypeEditor.cxx:22
 TGeoHypeEditor.cxx:23
 TGeoHypeEditor.cxx:24
 TGeoHypeEditor.cxx:25
 TGeoHypeEditor.cxx:26
 TGeoHypeEditor.cxx:27
 TGeoHypeEditor.cxx:28
 TGeoHypeEditor.cxx:29
 TGeoHypeEditor.cxx:30
 TGeoHypeEditor.cxx:31
 TGeoHypeEditor.cxx:32
 TGeoHypeEditor.cxx:33
 TGeoHypeEditor.cxx:34
 TGeoHypeEditor.cxx:35
 TGeoHypeEditor.cxx:36
 TGeoHypeEditor.cxx:37
 TGeoHypeEditor.cxx:38
 TGeoHypeEditor.cxx:39
 TGeoHypeEditor.cxx:40
 TGeoHypeEditor.cxx:41
 TGeoHypeEditor.cxx:42
 TGeoHypeEditor.cxx:43
 TGeoHypeEditor.cxx:44
 TGeoHypeEditor.cxx:45
 TGeoHypeEditor.cxx:46
 TGeoHypeEditor.cxx:47
 TGeoHypeEditor.cxx:48
 TGeoHypeEditor.cxx:49
 TGeoHypeEditor.cxx:50
 TGeoHypeEditor.cxx:51
 TGeoHypeEditor.cxx:52
 TGeoHypeEditor.cxx:53
 TGeoHypeEditor.cxx:54
 TGeoHypeEditor.cxx:55
 TGeoHypeEditor.cxx:56
 TGeoHypeEditor.cxx:57
 TGeoHypeEditor.cxx:58
 TGeoHypeEditor.cxx:59
 TGeoHypeEditor.cxx:60
 TGeoHypeEditor.cxx:61
 TGeoHypeEditor.cxx:62
 TGeoHypeEditor.cxx:63
 TGeoHypeEditor.cxx:64
 TGeoHypeEditor.cxx:65
 TGeoHypeEditor.cxx:66
 TGeoHypeEditor.cxx:67
 TGeoHypeEditor.cxx:68
 TGeoHypeEditor.cxx:69
 TGeoHypeEditor.cxx:70
 TGeoHypeEditor.cxx:71
 TGeoHypeEditor.cxx:72
 TGeoHypeEditor.cxx:73
 TGeoHypeEditor.cxx:74
 TGeoHypeEditor.cxx:75
 TGeoHypeEditor.cxx:76
 TGeoHypeEditor.cxx:77
 TGeoHypeEditor.cxx:78
 TGeoHypeEditor.cxx:79
 TGeoHypeEditor.cxx:80
 TGeoHypeEditor.cxx:81
 TGeoHypeEditor.cxx:82
 TGeoHypeEditor.cxx:83
 TGeoHypeEditor.cxx:84
 TGeoHypeEditor.cxx:85
 TGeoHypeEditor.cxx:86
 TGeoHypeEditor.cxx:87
 TGeoHypeEditor.cxx:88
 TGeoHypeEditor.cxx:89
 TGeoHypeEditor.cxx:90
 TGeoHypeEditor.cxx:91
 TGeoHypeEditor.cxx:92
 TGeoHypeEditor.cxx:93
 TGeoHypeEditor.cxx:94
 TGeoHypeEditor.cxx:95
 TGeoHypeEditor.cxx:96
 TGeoHypeEditor.cxx:97
 TGeoHypeEditor.cxx:98
 TGeoHypeEditor.cxx:99
 TGeoHypeEditor.cxx:100
 TGeoHypeEditor.cxx:101
 TGeoHypeEditor.cxx:102
 TGeoHypeEditor.cxx:103
 TGeoHypeEditor.cxx:104
 TGeoHypeEditor.cxx:105
 TGeoHypeEditor.cxx:106
 TGeoHypeEditor.cxx:107
 TGeoHypeEditor.cxx:108
 TGeoHypeEditor.cxx:109
 TGeoHypeEditor.cxx:110
 TGeoHypeEditor.cxx:111
 TGeoHypeEditor.cxx:112
 TGeoHypeEditor.cxx:113
 TGeoHypeEditor.cxx:114
 TGeoHypeEditor.cxx:115
 TGeoHypeEditor.cxx:116
 TGeoHypeEditor.cxx:117
 TGeoHypeEditor.cxx:118
 TGeoHypeEditor.cxx:119
 TGeoHypeEditor.cxx:120
 TGeoHypeEditor.cxx:121
 TGeoHypeEditor.cxx:122
 TGeoHypeEditor.cxx:123
 TGeoHypeEditor.cxx:124
 TGeoHypeEditor.cxx:125
 TGeoHypeEditor.cxx:126
 TGeoHypeEditor.cxx:127
 TGeoHypeEditor.cxx:128
 TGeoHypeEditor.cxx:129
 TGeoHypeEditor.cxx:130
 TGeoHypeEditor.cxx:131
 TGeoHypeEditor.cxx:132
 TGeoHypeEditor.cxx:133
 TGeoHypeEditor.cxx:134
 TGeoHypeEditor.cxx:135
 TGeoHypeEditor.cxx:136
 TGeoHypeEditor.cxx:137
 TGeoHypeEditor.cxx:138
 TGeoHypeEditor.cxx:139
 TGeoHypeEditor.cxx:140
 TGeoHypeEditor.cxx:141
 TGeoHypeEditor.cxx:142
 TGeoHypeEditor.cxx:143
 TGeoHypeEditor.cxx:144
 TGeoHypeEditor.cxx:145
 TGeoHypeEditor.cxx:146
 TGeoHypeEditor.cxx:147
 TGeoHypeEditor.cxx:148
 TGeoHypeEditor.cxx:149
 TGeoHypeEditor.cxx:150
 TGeoHypeEditor.cxx:151
 TGeoHypeEditor.cxx:152
 TGeoHypeEditor.cxx:153
 TGeoHypeEditor.cxx:154
 TGeoHypeEditor.cxx:155
 TGeoHypeEditor.cxx:156
 TGeoHypeEditor.cxx:157
 TGeoHypeEditor.cxx:158
 TGeoHypeEditor.cxx:159
 TGeoHypeEditor.cxx:160
 TGeoHypeEditor.cxx:161
 TGeoHypeEditor.cxx:162
 TGeoHypeEditor.cxx:163
 TGeoHypeEditor.cxx:164
 TGeoHypeEditor.cxx:165
 TGeoHypeEditor.cxx:166
 TGeoHypeEditor.cxx:167
 TGeoHypeEditor.cxx:168
 TGeoHypeEditor.cxx:169
 TGeoHypeEditor.cxx:170
 TGeoHypeEditor.cxx:171
 TGeoHypeEditor.cxx:172
 TGeoHypeEditor.cxx:173
 TGeoHypeEditor.cxx:174
 TGeoHypeEditor.cxx:175
 TGeoHypeEditor.cxx:176
 TGeoHypeEditor.cxx:177
 TGeoHypeEditor.cxx:178
 TGeoHypeEditor.cxx:179
 TGeoHypeEditor.cxx:180
 TGeoHypeEditor.cxx:181
 TGeoHypeEditor.cxx:182
 TGeoHypeEditor.cxx:183
 TGeoHypeEditor.cxx:184
 TGeoHypeEditor.cxx:185
 TGeoHypeEditor.cxx:186
 TGeoHypeEditor.cxx:187
 TGeoHypeEditor.cxx:188
 TGeoHypeEditor.cxx:189
 TGeoHypeEditor.cxx:190
 TGeoHypeEditor.cxx:191
 TGeoHypeEditor.cxx:192
 TGeoHypeEditor.cxx:193
 TGeoHypeEditor.cxx:194
 TGeoHypeEditor.cxx:195
 TGeoHypeEditor.cxx:196
 TGeoHypeEditor.cxx:197
 TGeoHypeEditor.cxx:198
 TGeoHypeEditor.cxx:199
 TGeoHypeEditor.cxx:200
 TGeoHypeEditor.cxx:201
 TGeoHypeEditor.cxx:202
 TGeoHypeEditor.cxx:203
 TGeoHypeEditor.cxx:204
 TGeoHypeEditor.cxx:205
 TGeoHypeEditor.cxx:206
 TGeoHypeEditor.cxx:207
 TGeoHypeEditor.cxx:208
 TGeoHypeEditor.cxx:209
 TGeoHypeEditor.cxx:210
 TGeoHypeEditor.cxx:211
 TGeoHypeEditor.cxx:212
 TGeoHypeEditor.cxx:213
 TGeoHypeEditor.cxx:214
 TGeoHypeEditor.cxx:215
 TGeoHypeEditor.cxx:216
 TGeoHypeEditor.cxx:217
 TGeoHypeEditor.cxx:218
 TGeoHypeEditor.cxx:219
 TGeoHypeEditor.cxx:220
 TGeoHypeEditor.cxx:221
 TGeoHypeEditor.cxx:222
 TGeoHypeEditor.cxx:223
 TGeoHypeEditor.cxx:224
 TGeoHypeEditor.cxx:225
 TGeoHypeEditor.cxx:226
 TGeoHypeEditor.cxx:227
 TGeoHypeEditor.cxx:228
 TGeoHypeEditor.cxx:229
 TGeoHypeEditor.cxx:230
 TGeoHypeEditor.cxx:231
 TGeoHypeEditor.cxx:232
 TGeoHypeEditor.cxx:233
 TGeoHypeEditor.cxx:234
 TGeoHypeEditor.cxx:235
 TGeoHypeEditor.cxx:236
 TGeoHypeEditor.cxx:237
 TGeoHypeEditor.cxx:238
 TGeoHypeEditor.cxx:239
 TGeoHypeEditor.cxx:240
 TGeoHypeEditor.cxx:241
 TGeoHypeEditor.cxx:242
 TGeoHypeEditor.cxx:243
 TGeoHypeEditor.cxx:244
 TGeoHypeEditor.cxx:245
 TGeoHypeEditor.cxx:246
 TGeoHypeEditor.cxx:247
 TGeoHypeEditor.cxx:248
 TGeoHypeEditor.cxx:249
 TGeoHypeEditor.cxx:250
 TGeoHypeEditor.cxx:251
 TGeoHypeEditor.cxx:252
 TGeoHypeEditor.cxx:253
 TGeoHypeEditor.cxx:254
 TGeoHypeEditor.cxx:255
 TGeoHypeEditor.cxx:256
 TGeoHypeEditor.cxx:257
 TGeoHypeEditor.cxx:258
 TGeoHypeEditor.cxx:259
 TGeoHypeEditor.cxx:260
 TGeoHypeEditor.cxx:261
 TGeoHypeEditor.cxx:262
 TGeoHypeEditor.cxx:263
 TGeoHypeEditor.cxx:264
 TGeoHypeEditor.cxx:265
 TGeoHypeEditor.cxx:266
 TGeoHypeEditor.cxx:267
 TGeoHypeEditor.cxx:268
 TGeoHypeEditor.cxx:269
 TGeoHypeEditor.cxx:270
 TGeoHypeEditor.cxx:271
 TGeoHypeEditor.cxx:272
 TGeoHypeEditor.cxx:273
 TGeoHypeEditor.cxx:274
 TGeoHypeEditor.cxx:275
 TGeoHypeEditor.cxx:276
 TGeoHypeEditor.cxx:277
 TGeoHypeEditor.cxx:278
 TGeoHypeEditor.cxx:279
 TGeoHypeEditor.cxx:280
 TGeoHypeEditor.cxx:281
 TGeoHypeEditor.cxx:282
 TGeoHypeEditor.cxx:283
 TGeoHypeEditor.cxx:284
 TGeoHypeEditor.cxx:285
 TGeoHypeEditor.cxx:286
 TGeoHypeEditor.cxx:287
 TGeoHypeEditor.cxx:288
 TGeoHypeEditor.cxx:289
 TGeoHypeEditor.cxx:290
 TGeoHypeEditor.cxx:291
 TGeoHypeEditor.cxx:292
 TGeoHypeEditor.cxx:293
 TGeoHypeEditor.cxx:294
 TGeoHypeEditor.cxx:295
 TGeoHypeEditor.cxx:296
 TGeoHypeEditor.cxx:297
 TGeoHypeEditor.cxx:298
 TGeoHypeEditor.cxx:299
 TGeoHypeEditor.cxx:300
 TGeoHypeEditor.cxx:301
 TGeoHypeEditor.cxx:302
 TGeoHypeEditor.cxx:303
 TGeoHypeEditor.cxx:304
 TGeoHypeEditor.cxx:305
 TGeoHypeEditor.cxx:306
 TGeoHypeEditor.cxx:307
 TGeoHypeEditor.cxx:308
 TGeoHypeEditor.cxx:309
 TGeoHypeEditor.cxx:310
 TGeoHypeEditor.cxx:311
 TGeoHypeEditor.cxx:312
 TGeoHypeEditor.cxx:313
 TGeoHypeEditor.cxx:314
 TGeoHypeEditor.cxx:315
 TGeoHypeEditor.cxx:316
 TGeoHypeEditor.cxx:317
 TGeoHypeEditor.cxx:318
 TGeoHypeEditor.cxx:319
 TGeoHypeEditor.cxx:320
 TGeoHypeEditor.cxx:321
 TGeoHypeEditor.cxx:322
 TGeoHypeEditor.cxx:323
 TGeoHypeEditor.cxx:324
 TGeoHypeEditor.cxx:325
 TGeoHypeEditor.cxx:326
 TGeoHypeEditor.cxx:327
 TGeoHypeEditor.cxx:328
 TGeoHypeEditor.cxx:329
 TGeoHypeEditor.cxx:330
 TGeoHypeEditor.cxx:331
 TGeoHypeEditor.cxx:332
 TGeoHypeEditor.cxx:333
 TGeoHypeEditor.cxx:334
 TGeoHypeEditor.cxx:335
 TGeoHypeEditor.cxx:336
 TGeoHypeEditor.cxx:337
 TGeoHypeEditor.cxx:338
 TGeoHypeEditor.cxx:339
 TGeoHypeEditor.cxx:340
 TGeoHypeEditor.cxx:341
 TGeoHypeEditor.cxx:342
 TGeoHypeEditor.cxx:343
 TGeoHypeEditor.cxx:344
 TGeoHypeEditor.cxx:345
 TGeoHypeEditor.cxx:346
 TGeoHypeEditor.cxx:347
 TGeoHypeEditor.cxx:348
 TGeoHypeEditor.cxx:349
 TGeoHypeEditor.cxx:350
 TGeoHypeEditor.cxx:351
 TGeoHypeEditor.cxx:352
 TGeoHypeEditor.cxx:353
 TGeoHypeEditor.cxx:354
 TGeoHypeEditor.cxx:355
 TGeoHypeEditor.cxx:356
 TGeoHypeEditor.cxx:357
 TGeoHypeEditor.cxx:358
 TGeoHypeEditor.cxx:359
 TGeoHypeEditor.cxx:360
 TGeoHypeEditor.cxx:361
 TGeoHypeEditor.cxx:362
 TGeoHypeEditor.cxx:363
 TGeoHypeEditor.cxx:364
 TGeoHypeEditor.cxx:365
 TGeoHypeEditor.cxx:366
 TGeoHypeEditor.cxx:367
 TGeoHypeEditor.cxx:368
 TGeoHypeEditor.cxx:369
 TGeoHypeEditor.cxx:370
 TGeoHypeEditor.cxx:371
 TGeoHypeEditor.cxx:372
 TGeoHypeEditor.cxx:373
 TGeoHypeEditor.cxx:374
 TGeoHypeEditor.cxx:375
 TGeoHypeEditor.cxx:376
 TGeoHypeEditor.cxx:377
 TGeoHypeEditor.cxx:378
 TGeoHypeEditor.cxx:379
 TGeoHypeEditor.cxx:380
 TGeoHypeEditor.cxx:381
 TGeoHypeEditor.cxx:382
 TGeoHypeEditor.cxx:383
 TGeoHypeEditor.cxx:384
 TGeoHypeEditor.cxx:385
 TGeoHypeEditor.cxx:386
 TGeoHypeEditor.cxx:387
 TGeoHypeEditor.cxx:388
 TGeoHypeEditor.cxx:389
 TGeoHypeEditor.cxx:390
 TGeoHypeEditor.cxx:391
 TGeoHypeEditor.cxx:392
 TGeoHypeEditor.cxx:393
 TGeoHypeEditor.cxx:394
 TGeoHypeEditor.cxx:395
 TGeoHypeEditor.cxx:396
 TGeoHypeEditor.cxx:397
 TGeoHypeEditor.cxx:398
 TGeoHypeEditor.cxx:399
 TGeoHypeEditor.cxx:400
 TGeoHypeEditor.cxx:401
 TGeoHypeEditor.cxx:402
 TGeoHypeEditor.cxx:403
 TGeoHypeEditor.cxx:404
 TGeoHypeEditor.cxx:405
 TGeoHypeEditor.cxx:406
 TGeoHypeEditor.cxx:407
 TGeoHypeEditor.cxx:408
 TGeoHypeEditor.cxx:409
 TGeoHypeEditor.cxx:410
 TGeoHypeEditor.cxx:411
 TGeoHypeEditor.cxx:412
 TGeoHypeEditor.cxx:413
 TGeoHypeEditor.cxx:414
 TGeoHypeEditor.cxx:415
 TGeoHypeEditor.cxx:416
 TGeoHypeEditor.cxx:417
 TGeoHypeEditor.cxx:418
 TGeoHypeEditor.cxx:419
 TGeoHypeEditor.cxx:420
 TGeoHypeEditor.cxx:421
 TGeoHypeEditor.cxx:422