// @(#)root/gpad:$Id$
// Author: Rene Brun   08/01/2000

/*************************************************************************
 * 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.             *
 *************************************************************************/

#include "TROOT.h"
#include "TGuiFactory.h"
#include "TInspectCanvas.h"
#include "TButton.h"
#include "TClass.h"
#include "TLine.h"
#include "TLink.h"
#include "TDataMember.h"
#include "TDataType.h"
#include "TRealData.h"
#include "TLatex.h"

ClassImp(TInspectCanvas)

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TInspectorObject                                                     //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

class TInspectorObject : public TObject
{
   // This class is designed to wrap a Foreign object in order to
   // inject it into the Browse sub-system.

public:

   TInspectorObject(void *obj, TClass *cl) : fObj(obj),fClass(cl) {};
   ~TInspectorObject(){;}

   void   *GetObject() const { return fObj; };
   void    Inspect() const {
      gGuiFactory->CreateInspectorImp(this, 400, 200);
   };
   TClass *IsA() const { return fClass; }

private:
   void     *fObj;   //! pointer to the foreign object
   TClass   *fClass; //! pointer to class of the foreign object

};


//______________________________________________________________________________//*-*
//*-*   A InspectCanvas is a canvas specialized to inspect Root objects.
//
//Begin_Html
/*
<img src="gif/InspectCanvas.gif">
*/
//End_Html
//


//______________________________________________________________________________
TInspectCanvas::TInspectCanvas() : TCanvas()
{
   // InspectCanvas default constructor.

   fBackward   = 0;
   fForward    = 0;
   fCurObject  = 0;
   fObjects    = 0;
   fLogx       = kFALSE;
   fLogy       = kFALSE;
   SetFillColor(0);
}


//_____________________________________________________________________________
TInspectCanvas::TInspectCanvas(UInt_t ww, UInt_t wh)
            : TCanvas("inspect","ROOT Object Inspector",ww,wh)
{
   // InspectCanvas constructor.

   fBackward   = 0;
   fForward    = 0;
   fCurObject  = 0;
   fObjects    = new TList;
   fLogx       = kFALSE;
   fLogy       = kFALSE;
   SetFillColor(0);
}


//______________________________________________________________________________
TInspectCanvas::~TInspectCanvas()
{
   // InspectCanvas default destructor.

   if (fObjects) {
      fObjects->Clear("nodelete");
      delete fObjects;
   }
}


//______________________________________________________________________________
void TInspectCanvas::InspectObject(TObject *obj)
{
   // Dump contents of obj in a graphics canvas.
   // Same action as TObject::Dump but in a graphical form.
   // In addition pointers to other objects can be followed.
   //
   // The following picture is the Inspect of a histogram object:
   //Begin_Html
   /*
   <img src="gif/hpxinspect.gif">
   */
   //End_Html

   Int_t cdate = 0;
   Int_t ctime = 0;
   UInt_t *cdatime = 0;
   Bool_t isdate = kFALSE;
   Bool_t isbits = kFALSE;
   const Int_t kname  = 1;
   const Int_t kvalue = 25;
   const Int_t ktitle = 37;
   const Int_t kline  = 1024;
   char line[kline];
   char *pname;

   TClass *cl = obj->IsA();
   if (cl == 0) return;
   TInspectorObject *proxy=0;
   if (!cl->IsTObject()) {
      // This is possible only if obj is actually a TInspectorObject
      // wrapping a non-TObject.
      proxy = (TInspectorObject*)obj;
      obj = (TObject*)proxy->GetObject();
   }

   if (!cl->GetListOfRealData()) cl->BuildRealData(obj);

   // Count number of data members in order to resize the canvas
   TRealData *rd;
   TIter      next(cl->GetListOfRealData());
   Int_t nreal = cl->GetListOfRealData()->GetSize();
   if (nreal == 0) return;

   Int_t nrows = 33;
   if (nreal+7 > nrows) nrows = nreal+7;
   Int_t nh = nrows*15;
   Int_t nw = 700;
   TVirtualPad *canvas = GetVirtCanvas();
   if (canvas) {
      canvas->Clear();                // remove primitives from canvas
      canvas->SetCanvasSize(nw, nh);  // set new size of drawing area
      canvas->Range(0,-3,20,nreal+4);
   }

   Float_t xvalue = 5;
   Float_t xtitle = 8;
   Float_t dy     = 1;
   Float_t ytext  = Float_t(nreal) - 1.5;
   Float_t tsize  = 0.99/ytext;
   if (tsize < 0.02) tsize = 0.02;
   if (tsize > 0.03) tsize = 0.03;

   // Create text objects
   TText tname, tvalue, ttitle;
   TText *tval;
   tname.SetTextFont(61);
   tname.SetTextAngle(0);
   tname.SetTextAlign(12);
   tname.SetTextColor(1);
   tname.SetTextSize(tsize);
   tvalue.SetTextFont(61);
   tvalue.SetTextAngle(0);
   tvalue.SetTextAlign(12);
   tvalue.SetTextColor(1);
   tvalue.SetTextSize(tsize);
   ttitle.SetTextFont(62);
   ttitle.SetTextAngle(0);
   ttitle.SetTextAlign(12);
   ttitle.SetTextColor(1);
   ttitle.SetTextSize(tsize);

   Float_t x1 = 0.2;
   Float_t x2 = 19.8;
   Float_t y1 = -0.5;
   Float_t y2 = Float_t(nreal) - 0.5;
   Float_t y3 = y2 + 1;
   Float_t y4 = y3 + 1.5;
   Float_t db = 25./GetWh();
   Float_t btop = 0.999;

   // Draw buttons
   fBackward = new TButton("backward","TInspectCanvas::GoBackward();",.01,btop-db,.15,btop);
   fBackward->Draw();
   fBackward->SetToolTipText("Inspect previous object");
   fForward  = new TButton("forward", "TInspectCanvas::GoForward();", .21,btop-db,.35,btop);
   fForward->Draw();
   fForward->SetToolTipText("Inspect next object");

   // Draw surrounding box and title areas
   TLine frame;
   frame.SetLineColor(1);
   frame.SetLineStyle(1);
   frame.SetLineWidth(1);
   frame.DrawLine(x1, y1, x2, y1);
   frame.DrawLine(x2, y1, x2, y4);
   frame.DrawLine(x2, y4, x1, y4);
   frame.DrawLine(x1, y4, x1, y1);
   frame.DrawLine(x1, y2, x2, y2);
   frame.DrawLine(x1, y3, x2, y3);
   frame.DrawLine(xvalue, y1, xvalue, y3);
   frame.DrawLine(xtitle, y1, xtitle, y3);
   ttitle.SetTextSize(0.8*tsize);
   ttitle.SetTextAlign(21);
   ttitle.DrawText(0.5*(x1+xvalue), y2+0.1, "Member Name");
   ttitle.DrawText(0.5*(xvalue+xtitle), y2+0.1, "Value");
   ttitle.DrawText(0.5*(xtitle+x2), y2+0.1, "Title");
   ttitle.SetTextSize(1.2*tsize);
   ttitle.SetTextColor(2);
   ttitle.SetTextAlign(11);
   ttitle.DrawText(x1+0.2, y3+0.1, cl->GetName());
   if (proxy==0) {
      ttitle.SetTextColor(4);
      strlcpy(line,obj->GetName(),kline);
      ttitle.DrawText(xvalue+0.2, y3+0.1, line);
      ttitle.SetTextColor(6);
      ttitle.DrawText(xtitle+2, y3+0.1, obj->GetTitle());
   } else {
      ttitle.SetTextColor(4);
      snprintf(line,1023,"%s:%d","Foreign object",0);
      ttitle.DrawText(xvalue+0.2, y3+0.1, line);
      ttitle.SetTextColor(6);
      ttitle.DrawText(xtitle+2, y3+0.1, "no title given");
   }
   ttitle.SetTextSize(tsize);
   ttitle.SetTextColor(1);
   ttitle.SetTextFont(11);
   ttitle.SetTextAlign(12);

   //---Now loop on data members-----------------------
   // We make 3 passes. Faster than one single pass because changing
   // font parameters is time consuming
   for (Int_t pass = 0; pass < 3; pass++) {
      ytext  = y2 - 0.5;
      next.Reset();
      while ((rd = (TRealData*) next())) {
         TDataMember *member = rd->GetDataMember();
         if (!member) continue;
         TDataType *membertype = member->GetDataType();
         isdate = kFALSE;
         if (strcmp(member->GetName(),"fDatime") == 0 && membertype && membertype->GetType() == kUInt_t) {
            isdate = kTRUE;
         }
         isbits = kFALSE;
         if (strcmp(member->GetName(),"fBits") == 0 && membertype && membertype->GetType() == kUInt_t) {
            isbits = kTRUE;
         }

         // Encode data member name
         pname = &line[kname];
         for (Int_t i=0;i<kline;i++) line[i] = ' ';
         line[kline-1] = 0;
         strlcpy(pname,rd->GetName(),kline-kname);
         if (strstr(member->GetFullTypeName(),"**")) strlcat(pname,"**",kline-kname);

         // Encode data value or pointer value
         tval = &tvalue;
         Int_t offset = rd->GetThisOffset();
         char *pointer = (char*)obj + offset;
         char **ppointer = (char**)(pointer);
         TLink *tlink = 0;

         TClass *clm=0;
         if (!membertype) {
            clm = member->GetClass();
         }

         if (member->IsaPointer()) {
            char **p3pointer = (char**)(*ppointer);
            if (clm && !clm->IsStartingWithTObject() ) {
               //NOTE: memory leak!
               p3pointer = (char**)new TInspectorObject(p3pointer,clm);
            }

            if (!p3pointer) {
               snprintf(&line[kvalue],kline-kvalue,"->0");
            } else if (!member->IsBasic()) {
               if (pass == 1) {
                  tlink = new TLink(xvalue+0.1, ytext, p3pointer);
               }
            } else if (membertype) {
               if (!strcmp(membertype->GetTypeName(), "char"))
                  strlcpy(&line[kvalue], *ppointer,kline-kvalue);
               else
                  strlcpy(&line[kvalue], membertype->AsString(p3pointer),kline-kvalue);
            } else if (!strcmp(member->GetFullTypeName(), "char*") ||
                     !strcmp(member->GetFullTypeName(), "const char*")) {
               strlcpy(&line[kvalue], *ppointer,kline-kvalue);
            } else {
               if (pass == 1) tlink = new TLink(xvalue+0.1, ytext, p3pointer);
            }
         } else if (membertype)
            if (isdate) {
               cdatime = (UInt_t*)pointer;
               TDatime::GetDateTime(cdatime[0],cdate,ctime);
               snprintf(&line[kvalue],kline-kvalue,"%d/%d",cdate,ctime);
            } else if (isbits) {
               snprintf(&line[kvalue],kline-kvalue,"0x%08x", *(UInt_t*)pointer);
            } else {
               strlcpy(&line[kvalue], membertype->AsString(pointer),kline-kvalue);
            }
         else
            snprintf(&line[kvalue],kline-kvalue,"->%lx ", (Long_t)pointer);

         // Encode data member title
         Int_t ltit = 0;
         if (isdate == kFALSE && strcmp(member->GetFullTypeName(), "char*") &&
             strcmp(member->GetFullTypeName(), "const char*")) {
            Int_t lentit = strlen(member->GetTitle());
            if (lentit >= kline-ktitle) lentit = kline-ktitle-1;
            strlcpy(&line[ktitle],member->GetTitle(),kline-ktitle);
            line[ktitle+lentit] = 0;
            ltit = ktitle;
         }

         // Ready to draw the name, value and title columns
         if (pass == 0)tname.DrawText( x1+0.1,  ytext, &line[kname]);
         if (pass == 1) {
            if (tlink) {
               tlink->SetTextFont(61);
               tlink->SetTextAngle(0);
               tlink->SetTextAlign(12);
               tlink->SetTextColor(2);
               tlink->SetTextSize(tsize);
               tlink->SetBit(kCanDelete);
               tlink->Draw();
               if (strstr(member->GetFullTypeName(),"**")) tlink->SetBit(TLink::kIsStarStar);
               tlink->SetName(member->GetTypeName());
            } else {
               tval->DrawText(xvalue+0.1, ytext, &line[kvalue]);
            }
         }
         if (pass == 2 && ltit) ttitle.DrawText(xtitle+0.3, ytext, &line[ltit]);
         ytext -= dy;
      }
   }
   Update();
   fCurObject = obj;
}


//______________________________________________________________________________
void TInspectCanvas::GoBackward()
{
   // static function , inspect previous object

   TInspectCanvas *inspect = (TInspectCanvas*)(gROOT->GetListOfCanvases())->FindObject("inspect");
   if (!inspect) return;
   TObject *cur = inspect->GetCurObject();
   TObject *obj = inspect->GetObjects()->Before(cur);
   if (obj)       inspect->InspectObject(obj);
}


//______________________________________________________________________________
void TInspectCanvas::GoForward()
{
   // static function , inspect next object

   TInspectCanvas *inspect = (TInspectCanvas*)(gROOT->GetListOfCanvases())->FindObject("inspect");
   if (!inspect) return;
   TObject *cur = inspect->GetCurObject();
   TObject *obj = inspect->GetObjects()->After(cur);
   if (obj)       inspect->InspectObject(obj);
}


//______________________________________________________________________________
void TInspectCanvas::Inspector(TObject *obj)
{
   // static function , interface to InspectObject.
   // Create the InspectCanvas if it does not exist yet.

   TVirtualPad *padsav = gPad;
   TInspectCanvas *inspect = (TInspectCanvas*)(gROOT->GetListOfCanvases())->FindObject("inspect");
   if (!inspect) inspect = new TInspectCanvas(700,600);
   else          inspect->cd();

   inspect->InspectObject(obj);
   inspect->GetObjects()->Add(obj);
   //obj->SetBit(kMustCleanup);

   if (padsav) padsav->cd();
}


//______________________________________________________________________________
void TInspectCanvas::RecursiveRemove(TObject *obj)
{
   // Recursively remove object from the list of objects.

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