ROOT logo
// @(#)root/ged:$Id: TGedEditor.cxx 31320 2009-11-19 16:42:53Z bellenot $
// Author: Marek Biskup, Ilka Antcheva 02/08/2003

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


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGedEditor                                                           //
//                                                                      //
// The main class of ROOT graphics editor. It manages the appearance    //
// of objects editors according to the selected object in the canvas    //
// (an object became selected after the user click on it using the      //
// left-mouse button).                                                  //
//                                                                      //
// Every object editor provides an object specific GUI and follows a    //
// simple naming convention: it has as a name the object class name     //
// concatinated with 'Editor' (e.g. for TGraph objects the object       //
// editor is TGraphEditor).                                             //
//                                                                      //
// The ROOT graphics editor can be activated by selecting 'Editor'      //
// from the View canvas menu, or SetLine/Fill/Text/MarkerAttributes     //
// from the context menu. The algorithm in use is simple: according to  //
// the selected object <obj> in the canvas it looks for a class name    //
// <obj>Editor. If a class with this name exists, the editor verifies   //
// that this class derives from the base editor class TGedFrame.        //
// It makes an instance of the object editor, scans all object base     //
// classes searching the corresponding object editors and makes an      //
// instance of the base class editor too. Once the object editor is in  //
// place, it sets the user interface elements according to the object   //
// state and is ready for interactions. When a new object of a          //
// different class is selected, a new object editor is loaded in the    //
// editor frame. The old one is cached in memory for potential reuse.   //
//                                                                      //
// Any created canvas will be shown with the editor if you have a       //
// .rootrc file in your working directory containing the the line:      //
// Canvas.ShowEditor:      true                                         //
//                                                                      //
// An created object can be set as selected in a macro by:              //
// canvas->Selected(parent_pad_of_object, object, 1);                   //
// The first parameter can be the canvas itself or the pad containing   //
// 'object'.                                                            //
//                                                                      //
// Begin_Html                                                           //
/*
<img src="gif/TGedEditor.gif">
*/
//End_Html
//////////////////////////////////////////////////////////////////////////

#include "TGedEditor.h"
#include "TCanvas.h"
#include "TGCanvas.h"
#include "TGTab.h"
#include "TGedFrame.h"
#include "TGLabel.h"
#include "TROOT.h"
#include "TClass.h"
#include "TBaseClass.h"

class TGedTabInfo : public TObject {
   // Helper class for managing visibility and order of created tabs.
public:
   TGTabElement      *fElement;
   TGCompositeFrame  *fContainer;

   TGedTabInfo(TGTabElement* el, TGCompositeFrame* f) :
      fElement(el), fContainer(f) {}
};


ClassImp(TGedEditor)

TGedEditor* TGedEditor::fgFrameCreator = 0;

//______________________________________________________________________________
TGedEditor* TGedEditor::GetFrameCreator()
{
   // Returns TGedEditor that currently creates TGedFrames.

   return fgFrameCreator;
}

//______________________________________________________________________________
void TGedEditor::SetFrameCreator(TGedEditor* e)
{
   // Set the TGedEditor that currently creates TGedFrames.

   fgFrameCreator = e;
}

//______________________________________________________________________________
TGedEditor::TGedEditor(TCanvas* canvas, UInt_t width, UInt_t height) :
   TGMainFrame(gClient->GetRoot(), width, height),
   fCan          (0),
   fTab          (0),
   fTabContainer (0),
   fModel        (0),
   fPad          (0),
   fCanvas       (0),
   fClass        (0),
   fGlobal       (kTRUE)
{
   // Constructor of graphics editor.

   fCan = new TGCanvas(this, 170, 10, kFixedWidth);
   AddFrame(fCan, new TGLayoutHints(kLHintsExpandY | kLHintsExpandX));

   fTab = new TGTab(fCan->GetViewPort(), 10, 10);
   fTab->Associate(fCan);
   fTab->SetCleanup(kDeepCleanup);
   fCan->SetContainer(fTab);

   fTabContainer = GetEditorTab("Style");

   gROOT->GetListOfCleanups()->Add(this);

   SetCanvas(canvas);
   if (fCanvas) {
      UInt_t ch = fCanvas->GetWindowHeight();
      if (ch)
         Resize(GetWidth(), ch > 700 ? 700 : ch);
      else
         Resize(GetWidth(), fCanvas->GetWh()<450 ? 450 : fCanvas->GetWh() + 4);
   } else {
      Resize(width, height);
   }

   MapSubwindows();
   MapWindow();
}

//______________________________________________________________________________
TGedEditor::~TGedEditor()
{
   // Editor destructor.

   Hide();

   if(fGlobal){
      TQObject::Disconnect("TCanvas", "Selected(TVirtualPad *, TObject *, Int_t)");
      TQObject::Disconnect("TCanvas", "Closed()");
   }

   // delete class editors
   TIter next(fFrameMap.GetTable());
   TPair* pair;
   while ((pair = (TPair*) next())) {
      if (pair->Value() != 0) {
         TGedFrame* frame  = (TGedFrame*) pair->Value();
         delete frame;
      }
   }

   TGedTabInfo* ti;
   TIter it1(&fCreatedTabs);
   while ((ti = (TGedTabInfo*) it1())) {
      fTab->AddFrame(ti->fElement,0);
      fTab->AddFrame(ti->fContainer,0);
   }

   delete fTab;
   delete ((TGFrameElement*)fList->First())->fLayout;
   delete fCan;
}

//______________________________________________________________________________
void TGedEditor::Update(TGedFrame* /*frame*/)
{
   // Virtual method that is called on any change in the dependent frames.
   // This implementation simply calls fPad Modified()/Update().

   if (fPad) {
      fPad->Modified();
      fPad->Update();
   }
}

//______________________________________________________________________________
TGCompositeFrame* TGedEditor::GetEditorTab(const char* name)
{
   // Find or create tab with name.

   return GetEditorTabInfo(name)->fContainer;
}

//______________________________________________________________________________
TGedTabInfo* TGedEditor::GetEditorTabInfo(const char* name)
{
   // Find or create tab with name.

   // look in list of created tabs
   if ( ! fCreatedTabs.IsEmpty()) {
      TIter next(&fCreatedTabs);
      TGedTabInfo* ti;
      while ((ti = (TGedTabInfo *) next())) {
         if (*ti->fElement->GetText() == name)
            return ti;
      }
   }

   // create tab
   TGCompositeFrame* tc = fTab->AddTab(new TGString(name));

   // remove created frame end tab element from the fTab frame
   TGTabElement *te = fTab->GetTabTab(fTab->GetNumberOfTabs() - 1);
   fTab->RemoveFrame(tc);
   fTab->RemoveFrame(te);

   // create a title frame for each tab
   TGedFrame* nf = CreateNameFrame(tc, name);
   nf->SetGedEditor(this);
   nf->SetModelClass(0);
   tc->AddFrame(nf, nf->GetLayoutHints());

   // add to list of created tabs
   TGedTabInfo* ti = new TGedTabInfo(te, tc);
   fCreatedTabs.Add(ti);

   return ti;
}

//______________________________________________________________________________
void TGedEditor::CloseWindow()
{
   // Called when closed via WM close button. Calls Hide().

   Hide();
}

//______________________________________________________________________________
void TGedEditor::ReinitWorkspace()
{
   // Clears windows in editor tab.
   // Unmap and withdraw currently shown frames and thus prepare for
   // construction of a new class layout or destruction.

   TIter next(&fVisibleTabs);
   TGedTabInfo* ti;
   while ((ti = (TGedTabInfo*)next())) {
      TGTabElement     *te = ti->fElement;
      TGCompositeFrame *tc = ti->fContainer;

      fTab->RemoveFrame(te);
      fTab->RemoveFrame(tc);

      TIter frames(tc->GetList());
      frames(); // skip name-frame
      TGFrameElement* fr;
      while ((fr = (TGFrameElement *) frames()) != 0) {
         TGFrame *f = fr->fFrame;
         tc->RemoveFrame(f);
         f->UnmapWindow();
         te->UnmapWindow();
         tc->UnmapWindow();
      }
      fVisibleTabs.Remove(ti);
   }
}

//______________________________________________________________________________
void TGedEditor::SetGlobal(Bool_t global)
{
   // Set editor global.

   fGlobal = global;
   if (fGlobal) {
      TQObject::Connect("TCanvas", "Selected(TVirtualPad *, TObject *, Int_t)",
                        "TGedEditor", this, "GlobalSetModel(TVirtualPad *, TObject *, Int_t)");

      TQObject::Connect("TCanvas", "Closed()",
                        "TGedEditor", this, "GlobalClosed()");
   }
}

//______________________________________________________________________________
void TGedEditor::GlobalClosed()
{
   // Delete global editor if no canvas exists.

   if (gROOT->GetListOfCanvases()->IsEmpty())
      TVirtualPadEditor::Terminate();
}

//______________________________________________________________________________
void TGedEditor::GlobalSetModel(TVirtualPad *pad, TObject * obj, Int_t ev)
{
   // Set canvas to global editor.

   if ((ev != kButton1Down) || !IsMapped() ||
       (obj && obj->InheritsFrom("TColorWheel")))
      return;

   TCanvas* can = pad->GetCanvas();
   // Do nothing if canvas is the same as before or
   // local editor of the canvas is active.
   if (can == fCanvas || can->GetShowEditor())
      return;

   Show();
}

//______________________________________________________________________________
void TGedEditor::ConnectToCanvas(TCanvas *c)
{
   // Connect this editor to the Selected signal of canvas 'c'.

   c->Connect("Selected(TVirtualPad*,TObject*,Int_t)", "TGedEditor",
              this, "SetModel(TVirtualPad*,TObject*,Int_t)");
}

//______________________________________________________________________________
void TGedEditor::DisconnectFromCanvas()
{
   // Disconnect this editor from the Selected signal of fCanvas.

   if (fCanvas)
      Disconnect(fCanvas, "Selected(TVirtualPad*,TObject*,Int_t)", this, "SetModel(TVirtualPad*,TObject*,Int_t)");
}

//______________________________________________________________________________
void TGedEditor::SetCanvas(TCanvas *newcan)
{
   // Change connection to another canvas.

   if (!newcan || (fCanvas == newcan)) return;

   DisconnectFromCanvas();
   fCanvas = newcan;

   SetWindowName(Form("%s_Editor", fCanvas->GetName()));
   fPad = fCanvas->GetSelectedPad();
   if (fPad == 0) fPad = fCanvas;
   ConnectToCanvas(fCanvas);
}

//______________________________________________________________________________
void TGedEditor::SetModel(TVirtualPad* pad, TObject* obj, Int_t event)
{
   // Activate object editors according to the selected object.

   if ((event != kButton1Down) || (obj && obj->InheritsFrom("TColorWheel")))
      return;

   if (gPad) gPad->GetVirtCanvas()->SetCursor(kWatch);
   gVirtualX->SetCursor(GetId(), gVirtualX->CreateCursor(kWatch));

   fPad = pad;
   if (obj == 0) obj = fPad;

   // keep selected by name
   TGTabElement* seltab = fTab->GetCurrentTab();

   Bool_t mapTabs = kFALSE;
   if (fModel != obj) {
      fModel = obj;
      if (fModel == 0 || fModel->IsA() != fClass) {
         ReinitWorkspace();
         mapTabs = kTRUE;
         // add Sytle tab to list of visible tabs
         fVisibleTabs.Add(fCreatedTabs.First());
         if (fModel) {
            fClass = fModel->IsA();
            // build a list of editors
            ActivateEditor(fClass, kTRUE);
         } else {
            fClass = 0;
         }

         // add class editors to fTabContainer
         TGedFrame* gfr;
         TIter ngf(&fGedFrames);
         while ((gfr = (TGedFrame*) ngf()))
            fTabContainer->AddFrame(gfr, gfr->GetLayoutHints());

         fExclMap.Clear();
         fGedFrames.Clear();

         // add visible tabs in fTab
         TIter next(&fVisibleTabs);
         TGedTabInfo* ti;
         while ((ti = (TGedTabInfo *) next())) {
            fTab->AddFrame(ti->fElement,0);
            fTab->AddFrame(ti->fContainer,0);
         }
      }
      ConfigureGedFrames(kTRUE);
   } else {
      ConfigureGedFrames(kFALSE);
   } // end fModel != obj

   if (mapTabs) { // selected object is different class
      TGedTabInfo* ti;
      TIter next(&fVisibleTabs);
      while ((ti = (TGedTabInfo *) next())) {
         ti->fElement->MapWindow();
         ti->fContainer->MapWindow();
      }
      if (seltab == 0 || fTab->SetTab(seltab->GetString(), kFALSE) == kFALSE)
         fTab->SetTab(0, kFALSE);
   }

   if (fGlobal)
      Layout();
   else
      ((TGMainFrame*)GetMainFrame())->Layout();

   if (gPad) gPad->GetVirtCanvas()->SetCursor(kPointer);
   gVirtualX->SetCursor(GetId(), gVirtualX->CreateCursor(kPointer));
}

//______________________________________________________________________________
void TGedEditor::Show()
{
   // Show editor.

   // gPad is setup properly in calling code for global and canvas editor.
   SetCanvas(gPad->GetCanvas());

   if (fGlobal) {
      SetModel(fCanvas->GetClickSelectedPad(), fCanvas->GetClickSelected(), kButton1Down);

      if (fCanvas->GetShowEditor())
         fCanvas->ToggleEditor();

      UInt_t dw = fClient->GetDisplayWidth();
      UInt_t cw = fCanvas->GetWindowWidth();
      UInt_t ch = fCanvas->GetWindowHeight();
      UInt_t cx = (UInt_t)fCanvas->GetWindowTopX();
      UInt_t cy = (UInt_t)fCanvas->GetWindowTopY();
      if (!ch)
         cy = cy + 20;      // embeded canvas protection

      Int_t gedx = 0, gedy = 0;

      if (cw + GetWidth() > dw) {
         gedx = cx + cw - GetWidth();
         gedy = ch - GetHeight();
      } else {
         if (cx > GetWidth())
            gedx = cx - GetWidth() - 20;
         else
            gedx = cx + cw + 10;
         gedy = cy - 20;
      }
      MoveResize(gedx, gedy, GetWidth(), ch > 700 ? 700 : ch);
      SetWMPosition(gedx, gedy);
   } else {
      SetModel(fCanvas, fCanvas, kButton1Down);
   }
   MapWindow();
   gVirtualX->RaiseWindow(GetId());

   if (!gROOT->GetListOfCleanups()->FindObject(this))
      gROOT->GetListOfCleanups()->Add(this);
}

//______________________________________________________________________________
void TGedEditor::Hide()
{
   // Hide editor. The editor is put into non-active state.

   UnmapWindow();
   ReinitWorkspace();
   fModel = 0; fClass = 0;
   DisconnectFromCanvas();
   fCanvas = 0; fPad = 0;
   gROOT->GetListOfCleanups()->Remove(this);
}

//______________________________________________________________________________
void TGedEditor::RecursiveRemove(TObject* obj)
{
   // Remove references to fModel in case the fModel is being deleted.
   // Deactivate attribute frames if they point to obj.

   if (obj == fPad) {
      // printf("TGedEditor::RecursiveRemove: %s - pad deleted.\n", locglob);
      SetModel(fCanvas, fCanvas, kButton1Down);
      return;
   }

   if (obj == fModel) {
      // printf("TGedEditor::RecursiveRemove: %s - model deleted.\n", locglob);
      SetModel(fPad, fPad, kButton1Down);
      return;
   }
}

//______________________________________________________________________________
void TGedEditor::ActivateEditor(TClass* cl, Bool_t recurse)
{
   // Searches for GedFrames for given class. In recursive mode look for class
   // editor in its list of bases.

   TPair     *pair = (TPair*) fFrameMap.FindObject(cl);
   TClass    *edClass = 0;
   TGedFrame *frame = 0;

   if (pair == 0) {
      edClass = TClass::GetClass(Form("%sEditor", cl->GetName()));

      if (edClass && edClass->InheritsFrom(TGedFrame::Class())) {
         TGWindow *exroot = (TGWindow*) fClient->GetRoot();
         fClient->SetRoot(fTabContainer);
         fgFrameCreator = this;
         frame = reinterpret_cast<TGedFrame*>(edClass->New());
         frame->SetModelClass(cl);
         fgFrameCreator = 0;
         fClient->SetRoot(exroot);
      }
      fFrameMap.Add(cl, frame);
   } else {
      frame =  (TGedFrame*)pair->Value();
   }

   Bool_t exclfr    = kFALSE;
   Bool_t exclbases = kFALSE;

   if (frame) {
      TPair* exclpair = (TPair*) fExclMap.FindObject(cl);
      if (exclpair) {
         exclfr = kTRUE;
         exclbases = (exclpair->Value() != 0);
      }

      if (!exclfr && frame->AcceptModel(fModel)){
         // handle extra tabs in the gedframe
         if (frame->GetExtraTabs()) {
            TIter next(frame->GetExtraTabs());
            TGedFrame::TGedSubFrame* subf;
            while ((subf = (TGedFrame::TGedSubFrame*)next())) {
               // locate the composite frame on created tabs
               TGedTabInfo* ti = GetEditorTabInfo(subf->fName);
               ti->fContainer->AddFrame(subf->fFrame, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
               if (fVisibleTabs.FindObject(ti) == 0)
                  fVisibleTabs.Add(ti);
            }
         }
         InsertGedFrame(frame);
      }
   }

   if (recurse && !exclbases) {
      if (frame)
         frame->ActivateBaseClassEditors(cl);
      else
         ActivateEditors(cl->GetListOfBases(), recurse);
   }
}

//______________________________________________________________________________
void TGedEditor::ActivateEditors(TList* bcl, Bool_t recurse)
{
   // Searches GedFrames for classes in the given list.

   TBaseClass *base;
   TIter next(bcl);

   while ((base = (TBaseClass*) next())) {
      ActivateEditor(base->GetClassPointer(), recurse);
   }
}

//______________________________________________________________________________
void  TGedEditor::ExcludeClassEditor(TClass* cl, Bool_t recurse)
{
   // Exclude editor for class cl from current construction.
   // If recurse is true the base-class editors of cl are also excluded.

   TPair* pair = (TPair*) fExclMap.FindObject(cl);
   if (pair) {
      if (recurse && pair->Value() == 0)
         pair->SetValue((TObject*)(Long_t)1); // hack, reuse TObject as Bool_t
   } else {
      fExclMap.Add(cl, (TObject*)(Long_t)(recurse ? 1 : 0));
   }
}

//______________________________________________________________________________
void TGedEditor::InsertGedFrame(TGedFrame* f)
{
   // Insert GedFrame in fGedFrames list according to priorities.

   // printf("%s %s  insert gedframe %s \n", fModel->GetName(), fModel->IsA()->GetName(),f->GetModelClass()->GetName());
   TObjLink* lnk = fGedFrames.FirstLink();
   if (lnk == 0) {
      fGedFrames.Add(f);
      return;
   }
   TGedFrame* cf;
   while (lnk) {
      cf = (TGedFrame*) lnk->GetObject();
      if (f->GetPriority() < cf->GetPriority()) {
         fGedFrames.AddBefore(lnk, f);
         return;
      }
      lnk = lnk->Next();
   }
   fGedFrames.Add(f);
}

//______________________________________________________________________________
void TGedEditor::ConfigureGedFrames(Bool_t objChanged)
{
   // Call SetModel in class editors.

   TGFrameElement *el;

   // Call SetModel on TGedNameFrames (first in the container list)
   // and map extra-tabs.
   TIter vistabs(&fVisibleTabs);
   vistabs(); // skip Style tab
   TGedTabInfo* ti;
   while ((ti = (TGedTabInfo *) vistabs())) {
      TIter fr(ti->fContainer->GetList());
      el = (TGFrameElement*) fr();
      ((TGedFrame*) el->fFrame)->SetModel(fModel);
      if(objChanged) {
         do {
            el->fFrame->MapSubwindows();
            el->fFrame->Layout();
            el->fFrame->MapWindow();
         } while((el = (TGFrameElement *) fr()));
      }
      ti->fContainer->Layout();
   }

   TIter next(fTabContainer->GetList());
   while ((el = (TGFrameElement *) next())) {
      if ((el->fFrame)->InheritsFrom(TGedFrame::Class())) {
         if (objChanged) {
         el->fFrame->MapSubwindows();
         ((TGedFrame *)(el->fFrame))->SetModel(fModel);
         el->fFrame->Layout();
         el->fFrame->MapWindow();
         } else {
            ((TGedFrame *)(el->fFrame))->SetModel(fModel);
         }
      }
   }
   fTabContainer->Layout();
}

//______________________________________________________________________________
TGedFrame* TGedEditor::CreateNameFrame(const TGWindow* parent, const char* /*tab_name*/)
{
   // Virtual function for creation of top name-frame in each tab.

   return new TGedNameFrame(parent);
}

//______________________________________________________________________________
void TGedEditor::PrintFrameStat()
{
   // Print contents of fFrameMap.

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