ROOT logo
// @(#)root/gl:$Id: TGLAnnotation.cxx 31664 2009-12-08 15:00:36Z matevz $
// Author:  Matevz and Alja Tadel  20/02/2009

/*************************************************************************
 * Copyright (C) 1995-2004, 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 "TGLAnnotation.h"

#include "TGLIncludes.h"
#include "TROOT.h"
#include "TColor.h"
#include "TGLUtil.h"
#include "TGLCamera.h"
#include "TGLRnrCtx.h"
#include "TGLSelectRecord.h"
#include "TGLViewerBase.h"
#include "TObjString.h"
#include "TGFrame.h"
#include "TGTextEdit.h"
#include "TGButton.h"
#include "TGLViewer.h"

#include "TMath.h"

#include <KeySymbols.h>

//______________________________________________________________________________
//
//
// GL-overaly annotation.
//
//

ClassImp(TGLAnnotation);

Color_t  TGLAnnotation::fgBackColor = kAzure + 10;
Color_t  TGLAnnotation::fgTextColor = kOrange;

//______________________________________________________________________________
TGLAnnotation::TGLAnnotation(TGLViewerBase *parent, const char *text, Float_t posx, Float_t posy) :
   TGLOverlayElement(TGLOverlayElement::kAnnotation),

   fPosX(posx), fPosY(posy),
   fMouseX(0),  fMouseY(0),
   fInDrag(kFALSE),
   fActive(kFALSE),
   fMainFrame(0), fTextEdit(0),

   fParent(0),

   fText(text),
   fTextSize(0.02),
   fTextAlign(TGLFont::kLeft),
   fBackColor(fgBackColor),
   fTextColor(fgTextColor),
   fTransparency(100),
   fDrawRefLine(kFALSE),
   fUseColorSet(kTRUE)
{
   // Constructor.
   // Create annotation as plain text

   parent->AddOverlayElement(this);
   fParent = (TGLViewer*)parent;
}

//______________________________________________________________________________
TGLAnnotation::TGLAnnotation(TGLViewerBase *parent, const char *text, Float_t posx, Float_t posy, TGLVector3 ref) :
   TGLOverlayElement(TGLOverlayElement::kAnnotation),
   fPosX(posx), fPosY(posy),
   fMouseX(0),  fMouseY(0),
   fInDrag(kFALSE),
   fActive(kFALSE),
   fMainFrame(0), fTextEdit(0),

   fParent(0),

   fText(text),
   fTextSize(0.02),
   fTextAlign(TGLFont::kLeft),
   fBackColor(fgBackColor),
   fTextColor(fgTextColor),
   fTransparency(40),
   fDrawRefLine(kTRUE),
   fUseColorSet(kFALSE)
{
   // Constructor.
   // Create annotaton by picking an object.

   fPointer = ref;
   parent->AddOverlayElement(this);
   fParent = (TGLViewer*)parent;
}

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

   fParent->RemoveOverlayElement(this);
   delete fMainFrame;
}

//______________________________________________________________________
Bool_t TGLAnnotation::Handle(TGLRnrCtx&          rnrCtx,
                             TGLOvlSelectRecord& selRec,
                             Event_t*            event)
{
   // Handle overlay event.
   // Return TRUE if event was handled.

   if (selRec.GetN() < 2) return kFALSE;
   Int_t recID = selRec.GetItem(1);

   switch (event->fType)
   {
      case kButtonPress:
      {
         fMouseX = event->fX;
         fMouseY = event->fY;
         fInDrag = kTRUE;

         return kTRUE;
      }
      case kButtonRelease:
      {
         fInDrag = kFALSE;

         if (recID == 2)
         {
            TGLViewer *v = fParent;
            delete this;
            v->RequestDraw(rnrCtx.ViewerLOD());
         }
         else if (recID == 3)
         {
            MakeEditor();
         }

         return kTRUE;
      }
      case kMotionNotify:
      {
         if (fInDrag)
         {
            const TGLRect& vp = rnrCtx.RefCamera().RefViewport();
            fPosX += (Float_t)(event->fX - fMouseX) / vp.Width();
            fPosY -= (Float_t)(event->fY - fMouseY) / vp.Height();
            fMouseX = event->fX;
            fMouseY = event->fY;
            // Make sure we don't go offscreen (use fDraw variables set in draw)
            if (fPosX < 0)
               fPosX = 0;
            else if (fPosX + fDrawW > 1.0f)
               fPosX = 1.0f - fDrawW;
            if (fPosY - fDrawH + fDrawY < 0)
               fPosY = fDrawH - fDrawY;
            else if (fPosY + fDrawY > 1.0f)
               fPosY = 1.0f - fDrawY;
         }
         return kTRUE;
      }
      default:
      {
         return kFALSE;
      }
   }
}

//______________________________________________________________________________
Bool_t TGLAnnotation::MouseEnter(TGLOvlSelectRecord& /*rec*/)
{
   // Mouse has entered overlay area.

   fActive = kTRUE;
   return kTRUE;
}

//______________________________________________________________________
void TGLAnnotation::MouseLeave()
{
   // Mouse has left overlay area.

   fActive = kFALSE;
}

/**************************************************************************/
void TGLAnnotation::Render(TGLRnrCtx& rnrCtx)
{
   // Render the annotation.

   Float_t old_depth_range[2];
   glGetFloatv(GL_DEPTH_RANGE, old_depth_range);
   glDepthRange(0, 0.001);

   glPushAttrib(GL_ENABLE_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
   TGLCapabilitySwitch lights_off(GL_LIGHTING, kFALSE);
   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
   glDisable(GL_CULL_FACE);
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

   const TGLRect& vp = rnrCtx.RefCamera().RefViewport();

   // prepare colors
   Color_t bgCol, fgCol;
   if (fUseColorSet)
   {
      fgCol = rnrCtx.ColorSet().Markup().GetColorIndex();

      TColor* c1 = gROOT->GetColor(rnrCtx.ColorSet().Markup().GetColorIndex());
      TColor* c2 = gROOT->GetColor(rnrCtx.ColorSet().Background().GetColorIndex());
      Float_t f1 = 0.5, f2 = 0.5;
      bgCol = TColor::GetColor(c1->GetRed()  *f1  + c2->GetRed()  *f2,
                               c1->GetGreen()*f1  + c2->GetGreen()*f2,
                               c1->GetBlue() *f1  + c2->GetBlue() *f2);
   }
   else {
      fgCol = fTextColor;
      bgCol = fBackColor;
   }

   if (fDrawRefLine)
   {
      TGLUtil::ColorTransparency(bgCol, fTransparency);
      TGLUtil::LineWidth(2);
      glBegin(GL_LINES);
      TGLVertex3 v = rnrCtx.RefCamera().ViewportToWorld(TGLVertex3(fPosX*vp.Width(), fPosY*vp.Height(), 0));
      glVertex3dv(v.Arr());
      glVertex3dv(fPointer.Arr());
      glEnd();
   }

   // reset matrix
   glMatrixMode(GL_PROJECTION);
   glPushMatrix();
   glLoadIdentity();
   if (rnrCtx.Selection())
   {
      TGLRect rect(*rnrCtx.GetPickRectangle());
      rnrCtx.GetCamera()->WindowToViewport(rect);
      gluPickMatrix(rect.X(), rect.Y(), rect.Width(), rect.Height(),
                    (Int_t*) rnrCtx.GetCamera()->RefViewport().CArr());
   }
   glOrtho(vp.X(), vp.Width(), vp.Y(), vp.Height(), 0, 1);
   glMatrixMode(GL_MODELVIEW);
   glPushMatrix();
   glLoadIdentity();

   glEnable(GL_POLYGON_OFFSET_FILL);
   glPolygonOffset(0.1, 1);

   TGLUtil::LineWidth(1);

   // move to pos
   Float_t posX = vp.Width()  * fPosX;
   Float_t posY = vp.Height() * fPosY;
   glTranslatef(posX, posY, -0.99);


   // get size of bg area, look at font attributes
   rnrCtx.RegisterFontNoScale(TMath::Nint(fTextSize*vp.Width()), "arial",  TGLFont::kPixmap, fFont);
   Float_t ascent, descent, line_height;
   fFont.MeasureBaseLineParams(ascent, descent, line_height);
   TObjArray* lines = fText.Tokenize("\n");
   Float_t width  = 0;
   Float_t height = 0;
   TIter  lit(lines);
   TObjString* osl;
   Float_t llx, lly, llz, urx, ury, urz;
   while ((osl = (TObjString*) lit()) != 0)
   {
      fFont.BBox(osl->GetString().Data(), llx, lly, llz, urx, ury, urz);
      width = TMath::Max(width, urx);
      height -= (line_height + descent);
   }
   width  += 2 * descent;
   height -= 2 * descent;

   // Store variables needed for border check when box is dragged.
   fDrawW = (Float_t) width / vp.Width();
   fDrawH = (Float_t) - height / vp.Height();
   fDrawY = line_height / vp.Height();

   // polygon background
   Float_t padT =  2;
   Int_t   padF = 10;
   Float_t padM = padF + 2 * padT;

   glPushName(0);

   // bg plain
   Float_t y = line_height;
   Float_t x = 0;
   glLoadName(1);
   TGLUtil::ColorTransparency(bgCol, fTransparency);
   glBegin(GL_QUADS);
   glVertex2f(x, y);
   glVertex2f(x, y + height);
   glVertex2f(x+width, y + height);
   glVertex2f(x+width, y);
   glEnd();

   // outline
   TGLUtil::ColorTransparency(fgCol, fTransparency);
   glBegin(GL_LINE_LOOP);
   glVertex2f(x, y);
   glVertex2f(x, y + height);
   glVertex2f(x+width, y + height);
   glVertex2f(x+width, y);
   glEnd();

   if (fActive && fTransparency < 100)
   {  // edit area

      TGLUtil::ColorTransparency(bgCol, fTransparency);
      // edit button
      glLoadName(2);
      glBegin(GL_QUADS);
      glVertex2f(x + padM, y);
      glVertex2f(x,        y);
      glVertex2f(x,        y + padM);
      glVertex2f(x + padM, y + padM);
      glEnd();
      // close button
      glLoadName(3);
      x = padM;
      glBegin(GL_QUADS);
      glVertex2f(x + padM, y);
      glVertex2f(x,        y);
      glVertex2f(x,        y + padM);
      glVertex2f(x + padM, y + padM);
      glEnd();

      // outlines
      TGLUtil::ColorTransparency(fgCol, fTransparency);
      x = 0; // left
      glBegin(GL_LINE_LOOP);
      glVertex2f(x + padM, y);
      glVertex2f(x,        y);
      glVertex2f(x,        y + padM);
      glVertex2f(x + padM, y + padM);
      glEnd(); // right
      x = padM;
      glBegin(GL_LINE_LOOP);
      glVertex2f(x + padM, y);
      glVertex2f(x,        y);
      glVertex2f(x,        y + padM);
      glVertex2f(x + padM, y + padM);
      glEnd();
   }
   glPopName();

   // text
   Float_t zOff = 0.2; // more than 0, else not rendered
   fFont.PreRender();
   TGLUtil::Color(fgCol);
   TIter  next_base(lines);
   TObjString* os;
   glPushMatrix();
   glTranslatef(descent, line_height, zOff);
   Float_t tx = 0;
   while ((os = (TObjString*) next_base()) != 0)
   {
      glTranslatef(0, -(line_height + descent), 0);
      if (fTextAlign == TGLFont::kLeft) {
         tx = 0;
      }
      else if  (fTextAlign == TGLFont::kCenterH) {
         tx = 0.5 * width - descent ;
      }
      else {
         tx = width - 2*descent;
      }
      fFont.Render(os->GetString(), tx, 0, 0, fTextAlign, TGLFont::kTop);
   }
   glPopMatrix();
   fFont.PostRender();

   // menu

   if (fActive && fTransparency < 100)
   {
      x = padT;
      y = padT + 0.5*padF + line_height;
      rnrCtx.RegisterFontNoScale(padF, "arial",  TGLFont::kPixmap, fMenuFont);
      fMenuFont.PreRender();
      fMenuFont.Render("X", x, y, zOff, TGLFont::kLeft, TGLFont::kCenterV);
      x += padM + padT;
      fMenuFont.Render("E", x, y, zOff, TGLFont::kLeft, TGLFont::kCenterV);
      fMenuFont.PostRender();
   }

   glMatrixMode(GL_PROJECTION);
   glPopMatrix();
   glMatrixMode(GL_MODELVIEW);
   glPopMatrix();

   glDepthRange(old_depth_range[0], old_depth_range[1]);
   glPopAttrib();
}

//______________________________________________________________________________
void TGLAnnotation::MakeEditor()
{
   // Show the annotation editor.

   if (fMainFrame == 0)
   {
      fMainFrame = new TGMainFrame(gClient->GetRoot(), 1000, 1000);
      fMainFrame->SetWindowName("Annotation Editor");

      TGVerticalFrame* vf = new TGVerticalFrame(fMainFrame);

      fTextEdit = new TGTextEdit(vf,  1000, 1000, kSunkenFrame);
      vf->AddFrame(fTextEdit,  new TGLayoutHints(kLHintsExpandX|kLHintsExpandY));

      TGHorizontalFrame* hf = new TGHorizontalFrame(vf);

      TGTextButton* btt1 = new TGTextButton(hf, "OK");
      hf->AddFrame(btt1, new TGLayoutHints(kLHintsExpandX, 2, 2, 2, 2));

      TGTextButton* btt2 = new TGTextButton(hf, "Cancel");
      hf->AddFrame(btt2, new TGLayoutHints(kLHintsExpandX, 2, 2, 2, 2));

      btt1->Connect("Clicked()", "TGLAnnotation", this, "UpdateText()");
      btt2->Connect("Clicked()", "TGLAnnotation", this, "CloseEditor()");

      vf->AddFrame(hf, new TGLayoutHints(kLHintsBottom | kLHintsRight | kLHintsExpandX, 2, 2, 5, 1));

      fMainFrame->AddFrame(vf,  new TGLayoutHints(kLHintsExpandX|kLHintsExpandY));
      fMainFrame->SetCleanup(kDeepCleanup);
      fMainFrame->MapSubwindows();
   }

   TGText *tgt = new TGText();
   tgt->LoadBuffer(fText.Data());
   fTextEdit->SetText(tgt);

   Int_t nrow = tgt->RowCount();
   Int_t h = nrow*20;
   Int_t w = fTextEdit->ReturnLongestLineWidth();
   fMainFrame->Resize(TMath::Max(100, w+30), TMath::Max(100, h+40));

   fMainFrame->Layout();
   fMainFrame->MapWindow();
}

//______________________________________________________________________________
void TGLAnnotation::CloseEditor()
{
   // Close the annotation editor.

   fMainFrame->UnmapWindow();
}

//______________________________________________________________________________
void TGLAnnotation::UpdateText()
{
   // Modify the annotation text from the text-edit widget.

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