ROOT logo
// @(#)root/gui:$Id$
// Author: Fons Rademakers   15/07/98

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TRootEmbeddedCanvas                                                  //
//                                                                      //
// This class creates a TGCanvas in which a TCanvas is created. Use     //
// GetCanvas() to get a pointer to the TCanvas.                         //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TRootEmbeddedCanvas.h"
#include "TCanvas.h"
#include "TROOT.h"
#include "Riostream.h"
#include "TStyle.h"
#include "TPluginManager.h"
#include "TVirtualGL.h"
#include "TGDNDManager.h"
#include "TBufferFile.h"
#include "TImage.h"
#include "TClass.h"
#include "TUrl.h"

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TRootEmbeddedContainer                                               //
//                                                                      //
// Utility class used by TRootEmbeddedCanvas. The TRootEmbeddedContainer//
// is the frame embedded in the TGCanvas widget. The ROOT graphics goes //
// into this frame. This class is used to enable input events on this   //
// graphics frame and forward the events to the TRootEmbeddedCanvas     //
// handlers.                                                            //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

class TRootEmbeddedContainer : public TGCompositeFrame {
private:
   TRootEmbeddedCanvas  *fCanvas;    // pointer back to embedded canvas
public:
   TRootEmbeddedContainer(TRootEmbeddedCanvas *c, Window_t id, const TGWindow *parent);

   Bool_t  HandleButton(Event_t *ev)
               { return fCanvas->HandleContainerButton(ev); }
   Bool_t  HandleDoubleClick(Event_t *ev)
               { return fCanvas->HandleContainerDoubleClick(ev); }
   Bool_t  HandleConfigureNotify(Event_t *ev)
               { TGFrame::HandleConfigureNotify(ev);
                  return fCanvas->HandleContainerConfigure(ev); }
   Bool_t  HandleKey(Event_t *ev)
               { return fCanvas->HandleContainerKey(ev); }
   Bool_t  HandleMotion(Event_t *ev)
               { return fCanvas->HandleContainerMotion(ev); }
   Bool_t  HandleExpose(Event_t *ev)
               { return fCanvas->HandleContainerExpose(ev); }
   Bool_t  HandleCrossing(Event_t *ev)
               { return fCanvas->HandleContainerCrossing(ev); }
   void    SetEditable(Bool_t) { }
};

//______________________________________________________________________________
TRootEmbeddedContainer::TRootEmbeddedContainer(TRootEmbeddedCanvas *c, Window_t id,
   const TGWindow *p) : TGCompositeFrame(gClient, id, p)
{
   // Create a canvas container.

   fCanvas = c;

   gVirtualX->GrabButton(fId, kAnyButton, kAnyModifier,
                         kButtonPressMask | kButtonReleaseMask |
                         kPointerMotionMask, kNone, kNone);

   AddInput(kKeyPressMask | kKeyReleaseMask | kPointerMotionMask |
            kExposureMask | kStructureNotifyMask | kLeaveWindowMask);

   fEditDisabled = kEditDisableGrab;
}




ClassImp(TRootEmbeddedCanvas)

//______________________________________________________________________________
TRootEmbeddedCanvas::TRootEmbeddedCanvas(const char *name, const TGWindow *p,
            UInt_t w, UInt_t h, UInt_t options, ULong_t back)
   : TGCanvas(p, w, h, options, back)
{
   // Create an TCanvas embedded in a TGFrame. A pointer to the TCanvas can
   // be obtained via the GetCanvas() member function. To embed a canvas
   // derived from a TCanvas do the following:
   // TRootEmbeddedCanvas *embedded = new TRootEmbeddedCanvas(0, p, w, h);
   //      [note name must be 0, not null string ""]
   // Int_t wid = embedded->GetCanvasWindowId();
   // TMyCanvas *myc = new TMyCanvas("myname", 10, 10, wid);
   // embedded->AdoptCanvas(myc);
   //      [ the MyCanvas is adopted by the embedded canvas and will be
   //        destroyed by it ]

   fCanvas  = 0;
   fButton  = 0;
   fAutoFit = kTRUE;
   fEditDisabled = kEditDisableLayout;

   fCWinId = -1;

   if (gStyle->GetCanvasPreferGL()) {
      //first, initialize GL (if not yet)
      if (!gGLManager) {
         TString x = "win32";
         if (gVirtualX->InheritsFrom("TGX11"))
            x = "x11";
         else if (gVirtualX->InheritsFrom("TGCocoa"))
            x = "osx";

         TPluginHandler *ph = gROOT->GetPluginManager()->FindHandler("TGLManager", x);

         if (ph && ph->LoadPlugin() != -1) {
            if (!ph->ExecPlugin(0)) {
               Warning("CreateCanvas",
                       "Cannot load GL, will use default canvas imp instead\n");
            }
         }
      }

      if (gGLManager)
         fCWinId = gGLManager->InitGLWindow((ULong_t)GetViewPort()->GetId());
      //Context creation deferred till TCanvas creation (since there is no way to pass it to TCanvas).

      if (!gGLManager || fCWinId == -1)
         gStyle->SetCanvasPreferGL(kFALSE);//TCanvas should not use gl.
   }
   if (fCWinId == -1)
      fCWinId = gVirtualX->InitWindow((ULong_t)GetViewPort()->GetId());

   Window_t win = gVirtualX->GetWindowID(fCWinId);
   fCanvasContainer = new TRootEmbeddedContainer(this, win, GetViewPort());
   SetContainer(fCanvasContainer);

   TString cname;
   if (name) cname = name;
   else cname = TString::Format("%s_canvas", GetName());
   fCanvas = new TCanvas(cname.Data(), w, h, fCWinId);

   // define DND types
   fDNDTypeList = new Atom_t[3];
   fDNDTypeList[0] = gVirtualX->InternAtom("application/root", kFALSE);
   fDNDTypeList[1] = gVirtualX->InternAtom("text/uri-list", kFALSE);
   fDNDTypeList[2] = 0;
   gVirtualX->SetDNDAware(fId, fDNDTypeList);
   SetDNDTarget(kTRUE);

   if (!p) {
      fCanvas->SetBorderMode(0);
      MapSubwindows();
      Resize(100, 100);
   }
}

//______________________________________________________________________________
TRootEmbeddedCanvas::~TRootEmbeddedCanvas()
{
   // Delete embedded ROOT canvas.

   if (!MustCleanup()) {
      delete fCanvas;
      delete fCanvasContainer;
   }
   delete [] fDNDTypeList;
}

//______________________________________________________________________________
void TRootEmbeddedCanvas::AdoptCanvas(TCanvas *c)
{
   // Canvas c is adopted from this embedded canvas.

   if(c == 0) return;
   c->EmbedInto(fCWinId, fWidth, fHeight);
   fCanvas = c;
}

//______________________________________________________________________________
Bool_t TRootEmbeddedCanvas::HandleContainerButton(Event_t *event)
{
   // Handle mouse button events in the canvas container.

   if (!fCanvas) return kTRUE;

   Int_t button = event->fCode;
   Int_t x = event->fX;
   Int_t y = event->fY;

   if (event->fType == kButtonPress) {
      fButton = button;
      if (button == kButton1) {
         if (event->fState & kKeyShiftMask)
            fCanvas->HandleInput(EEventType(7), x, y);
         else
            fCanvas->HandleInput(kButton1Down, x, y);
      }
      if (button == kButton2)
         fCanvas->HandleInput(kButton2Down, x, y);
      if (button == kButton3) {
         fCanvas->HandleInput(kButton3Down, x, y);
         fButton = 0;  // button up is consumed by TContextMenu
      }

   } else if (event->fType == kButtonRelease) {
      if (button == kButton1)
         fCanvas->HandleInput(kButton1Up, x, y);
      if (button == kButton2)
         fCanvas->HandleInput(kButton2Up, x, y);
      if (button == kButton3)
         fCanvas->HandleInput(kButton3Up, x, y);
      if (button == kButton4)
         fCanvas->HandleInput(EEventType(5), x, y);//hack
      if (button == kButton5)
         fCanvas->HandleInput(EEventType(6), x, y);//hack

      fButton = 0;
   }

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TRootEmbeddedCanvas::HandleContainerDoubleClick(Event_t *event)
{
   // Handle mouse button double click events in the canvas container.

   if (!fCanvas) return kTRUE;

   Int_t button = event->fCode;
   Int_t x = event->fX;
   Int_t y = event->fY;

   if (button == kButton1)
      fCanvas->HandleInput(kButton1Double, x, y);
   if (button == kButton2)
      fCanvas->HandleInput(kButton2Double, x, y);
   if (button == kButton3)
      fCanvas->HandleInput(kButton3Double, x, y);

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TRootEmbeddedCanvas::HandleContainerConfigure(Event_t *)
{
   // Handle configure (i.e. resize) event.

   if (fAutoFit && fCanvas) {
      fCanvas->Resize();
      fCanvas->Update();
   }
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TRootEmbeddedCanvas::HandleContainerKey(Event_t *event)
{
   // Handle keyboard events in the canvas container.

   static EGEventType previous_event = kOtherEvent;
   static UInt_t previous_keysym = 0;

   if (!fCanvas) return kTRUE;

   if (event->fType == kGKeyPress) {
      fButton = event->fCode;
      UInt_t keysym;
      char str[2];
      gVirtualX->LookupString(event, str, sizeof(str), keysym);

      if (str[0] == kESC){   // ESC sets the escape flag
         gROOT->SetEscape();
         fCanvas->HandleInput(kButton1Up, 0, 0);
         fCanvas->HandleInput(kMouseMotion, 0, 0);
         gPad->Modified();
         return kTRUE;
      }
      if (str[0] == 3)   // ctrl-c sets the interrupt flag
         gROOT->SetInterrupt();

      // handle arrow keys
      if (keysym > 0x1011 && keysym < 0x1016) {
         Window_t dum1, dum2, wid;
         UInt_t mask = 0;
         Int_t mx, my, tx, ty;
         wid = gVirtualX->GetDefaultRootWindow();
         gVirtualX->QueryPointer(wid, dum1, dum2, mx, my, mx, my, mask);
         gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(),
                                         fCanvasContainer->GetId(),
                                         mx, my, tx, ty, dum1);
         fCanvas->HandleInput(kArrowKeyPress, tx, ty);
         // handle case where we got consecutive same keypressed events coming
         // from auto-repeat on Windows (as it fires only successive keydown events)
         if ((previous_keysym == keysym) && (previous_event == kGKeyPress)) {
            switch (keysym) {
               case 0x1012: // left
                  gVirtualX->Warp(--mx, my, wid); --tx;
                  break;
               case 0x1013: // up
                  gVirtualX->Warp(mx, --my, wid); --ty;
                  break;
               case 0x1014: // right
                  gVirtualX->Warp(++mx, my, wid); ++tx;
                  break;
               case 0x1015: // down
                  gVirtualX->Warp(mx, ++my, wid); ++ty;
                  break;
               default:
                  break;
            }
            fCanvas->HandleInput(kArrowKeyRelease, tx, ty);
         }
         previous_keysym = keysym;
      }
      else {
         fCanvas->HandleInput(kKeyPress, str[0], keysym);
      }
   } else if (event->fType == kKeyRelease) {
      UInt_t keysym;
      char str[2];
      gVirtualX->LookupString(event, str, sizeof(str), keysym);

      if (keysym > 0x1011 && keysym < 0x1016) {
         Window_t dum1, dum2, wid;
         UInt_t mask = 0;
         Int_t mx, my, tx, ty;
         wid = gVirtualX->GetDefaultRootWindow();
         gVirtualX->QueryPointer(wid, dum1, dum2, mx, my, mx, my, mask);
         switch (keysym) {
            case 0x1012: // left
               gVirtualX->Warp(--mx, my, wid);
               break;
            case 0x1013: // up
               gVirtualX->Warp(mx, --my, wid);
               break;
            case 0x1014: // right
               gVirtualX->Warp(++mx, my, wid);
               break;
            case 0x1015: // down
               gVirtualX->Warp(mx, ++my, wid);
               break;
            default:
               break;
         }
         gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(),
                                         fCanvasContainer->GetId(),
                                         mx, my, tx, ty, dum1);
         fCanvas->HandleInput(kArrowKeyRelease, tx, ty);
         previous_keysym = keysym;
      }
      fButton = 0;
   }
   previous_event = event->fType;
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TRootEmbeddedCanvas::HandleContainerMotion(Event_t *event)
{
   // Handle mouse motion event in the canvas container.

   if (!fCanvas) return kTRUE;

   Int_t x = event->fX;
   Int_t y = event->fY;

   if (fButton == 0)
      fCanvas->HandleInput(kMouseMotion, x, y);
   if (fButton == kButton1) {
      if (event->fState & kKeyShiftMask)
         fCanvas->HandleInput(EEventType(8), x, y);
      else
         fCanvas->HandleInput(kButton1Motion, x, y);
   }
   if (fButton == kButton2)
      fCanvas->HandleInput(kButton2Motion, x, y);

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TRootEmbeddedCanvas::HandleContainerExpose(Event_t *event)
{
   // Handle expose events.

   if (!fCanvas) return kTRUE;

   if (event->fCount == 0)
      fCanvas->Flush();

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TRootEmbeddedCanvas::HandleContainerCrossing(Event_t *event)
{
   // Handle enter/leave events. Only leave is activated at the moment.

   if (!fCanvas) return kTRUE;

   Int_t x = event->fX;
   Int_t y = event->fY;

   // pointer grabs create also an enter and leave event but with fCode
   // either kNotifyGrab or kNotifyUngrab, don't propagate these events
   if (event->fType == kLeaveNotify && event->fCode == kNotifyNormal)
      fCanvas->HandleInput(kMouseLeave, x, y);

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TRootEmbeddedCanvas::HandleDNDDrop(TDNDData *data)
{
   // Handle drop events.

   static Atom_t rootObj  = gVirtualX->InternAtom("application/root", kFALSE);
   static Atom_t uriObj  = gVirtualX->InternAtom("text/uri-list", kFALSE);

   if (data->fDataType == rootObj) {
      TBufferFile buf(TBuffer::kRead, data->fDataLength, (void *)data->fData);
      buf.SetReadMode();
      TObject *obj = (TObject *)buf.ReadObjectAny(TObject::Class());
      if (!obj) return kTRUE;
      gPad->Clear();
      if (obj->InheritsFrom("TKey")) {
         TObject *object = (TObject *)gROOT->ProcessLine(Form("((TKey *)0x%lx)->ReadObj();", (ULong_t)obj));
         if (!object) return kTRUE;
         if (object->InheritsFrom("TGraph"))
            object->Draw("ALP");
         else if (object->InheritsFrom("TImage"))
            object->Draw("x");
         else if (object->IsA()->GetMethodAllAny("Draw"))
            object->Draw();
      }
      else if (obj->InheritsFrom("TGraph"))
         obj->Draw("ALP");
      else if (obj->IsA()->GetMethodAllAny("Draw"))
         obj->Draw();
      gPad->Modified();
      gPad->Update();
      return kTRUE;
   }
   else if (data->fDataType == uriObj) {
      TString sfname((char *)data->fData);
      if (sfname.Length() > 7) {
         sfname.ReplaceAll("\r\n", "");
         TUrl uri(sfname.Data());
         if (sfname.EndsWith(".bmp") ||
            sfname.EndsWith(".gif") ||
            sfname.EndsWith(".jpg") ||
            sfname.EndsWith(".png") ||
            sfname.EndsWith(".ps")  ||
            sfname.EndsWith(".eps") ||
            sfname.EndsWith(".pdf") ||
            sfname.EndsWith(".tiff") ||
            sfname.EndsWith(".xpm")) {
            TImage *img = TImage::Open(uri.GetFile());
            if (img) {
               img->Draw("x");
               img->SetEditable(kTRUE);
            }
         }
         gPad->Modified();
         gPad->Update();
      }
   }
   return kFALSE;
}

//______________________________________________________________________________
Atom_t TRootEmbeddedCanvas::HandleDNDPosition(Int_t /*x*/, Int_t /*y*/, Atom_t action,
                                              Int_t xroot, Int_t yroot)
{
   // Handle dragging position events.

   Int_t    px = 0, py = 0;
   Window_t wtarget;

   gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(),
                                   gVirtualX->GetWindowID(fCanvas->GetCanvasID()),
                                   xroot, yroot, px, py, wtarget);

   TPad *pad = fCanvas->Pick(px, py, 0);
   if (pad) {
      pad->cd();
      gROOT->SetSelectedPad(pad);
      // make sure the pad is highlighted (on Windows)
      pad->Update();
   }
   return action;
}

//______________________________________________________________________________
Atom_t TRootEmbeddedCanvas::HandleDNDEnter(Atom_t *typelist)
{
   // Handle drag enter events.

   static Atom_t rootObj  = gVirtualX->InternAtom("application/root", kFALSE);
   static Atom_t uriObj  = gVirtualX->InternAtom("text/uri-list", kFALSE);
   Atom_t ret = kNone;
   for (int i = 0; typelist[i] != kNone; ++i) {
      if (typelist[i] == rootObj)
         ret = rootObj;
      if (typelist[i] == uriObj)
         ret = uriObj;
   }
   return ret;
}

//______________________________________________________________________________
Bool_t TRootEmbeddedCanvas::HandleDNDLeave()
{
   // Handle drag leave events.

   return kTRUE;
}

//______________________________________________________________________________
void TRootEmbeddedCanvas::SavePrimitive(ostream &out, Option_t *option /*= ""*/)
{
   // Save an embedded canvas as a C++ statement(s) on output stream out.

   if (!GetCanvas()) return;

   if (fBackground != GetDefaultFrameBackground()) SaveUserColor(out, option);

   char quote ='"';

   out << endl << "   // embedded canvas" << endl;
   out << "   TRootEmbeddedCanvas *";
   out << GetName() << " = new TRootEmbeddedCanvas(0" << "," << fParent->GetName()
       << "," << GetWidth() << "," << GetHeight();

   if (fBackground == GetDefaultFrameBackground()) {
      if (GetOptions() == (kSunkenFrame | kDoubleBorder)) {
         out <<");" << endl;
      } else {
         out << "," << GetOptionString() <<");" << endl;
      }
   } else {
      out << "," << GetOptionString() << ",ucolor);" << endl;
   }
   if (option && strstr(option, "keep_names"))
      out << "   " << GetName() << "->SetName(\"" << GetName() << "\");" << endl;

   out << "   Int_t w" << GetName() << " = " << GetName()
       << "->GetCanvasWindowId();" << endl;

   static int n = 123;
   TString cname = TString::Format("c%d", n);

   out << "   TCanvas *";
   out <<  cname << " = new TCanvas(";
   out << quote << cname.Data() << quote << ", 10, 10, w"
       << GetName() << ");" << endl;
   out << "   " << GetName() << "->AdoptCanvas(" << cname
       << ");" << endl;

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