// @(#)root/gui:$Id$
// Author: Valeriy Onuchin & Fons Rademakers   18/10/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.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGImageMap (with TGRegion and TGRegionWithId help classes)           //
//                                                                      //
// A TGImageMap provides the functionality like a clickable image in    //
// a web browser with sensitive regions (MAP HTML tag).                 //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TGImageMap.h"
#include "TRefCnt.h"
#include "TGMenu.h"
#include "TGToolTip.h"
#include "TList.h"
#include "TArrayS.h"


ClassImp(TGRegion)
ClassImp(TGRegionWithId)
ClassImpQ(TGImageMap)


TGRegionWithId  *gCurrentRegion; // current region

static TGRegion *gEmptyRegion = 0;
static Int_t gPointerX;  // current X mouse position
static Int_t gPointerY;  // current Y mouse position



class TGRegionData : public TRefCnt {

friend class TGRegion;

private:
   Region_t   fRgn;     // region handle
   Bool_t     fIsNull;  // true if null region

public:
   TGRegionData() { fRgn = 0; fIsNull = kTRUE; AddReference(); }
   ~TGRegionData() { }
   TGRegionData &operator=(const TGRegionData &r);
};

//______________________________________________________________________________
TGRegionData &TGRegionData::operator=(const TGRegionData &r)
{
   // Assignemnt of region data object.

   if (this != &r) {
      fRefs   = r.fRefs;
      fRgn    = r.fRgn;
      fIsNull = r.fIsNull;
   }
   return *this;
}


////////////////////////////////////////////////////////////////////////////////
//______________________________________________________________________________
TGRegion::TGRegion()
{
   // Create a region object.

   if (!gEmptyRegion)                      // avoid too many allocs
      gEmptyRegion = new TGRegion(kTRUE);

   fData = gEmptyRegion->fData;
   fData->AddReference();
}

//______________________________________________________________________________
TGRegion::TGRegion(Bool_t is_null)
{
   // Create empty region.

   fData          = new TGRegionData;
   fData->fRgn    = gVirtualX->CreateRegion();
   fData->fIsNull = is_null;
}

//______________________________________________________________________________
TGRegion::TGRegion(Int_t x, Int_t y, UInt_t w, UInt_t h, ERegionType)
{
   // Create and initialize a region with a rectangle.

   fData          = new TGRegionData;
   fData->fRgn    = gVirtualX->CreateRegion();
   fData->fIsNull = kFALSE;

   Rectangle_t xr;
   xr.fX      = (Short_t) x;
   xr.fY      = (Short_t) y;
   xr.fWidth  = (UShort_t) w;
   xr.fHeight = (UShort_t) h;
   gVirtualX->UnionRectWithRegion(&xr, fData->fRgn, fData->fRgn);
}

//______________________________________________________________________________
TGRegion::TGRegion(Int_t n, TPoint *points, Bool_t winding)
{
   // Create and intialize a region with a polygon.

   fData            = new TGRegionData;
   fData->fIsNull   = kFALSE;
   Point_t *gpoints = new Point_t[n];

   for (int i = 0; i < n; i++) {
      gpoints[i].fX = (Short_t) points[i].GetX();
      gpoints[i].fY = (Short_t) points[i].GetY();
   }

   fData->fRgn = gVirtualX->PolygonRegion(gpoints, n, winding);
}

//______________________________________________________________________________
TGRegion::TGRegion(const TArrayS &x, const TArrayS &y, Bool_t winding)
{
   // Create and initialize a region with an X and a Y array of points.

   fData          = new TGRegionData;
   fData->fIsNull = kFALSE;

   Int_t n = x.GetSize();
   if (n != y.GetSize()) {
      Error("TGRegion", "x and y arrays must have same length");
      return;
   }
   Point_t *gpoints = new Point_t[n];

   for (int i = 0; i < n; i++) {
      gpoints[i].fX = x.GetArray()[i];
      gpoints[i].fY = y.GetArray()[i];
   }

   fData->fRgn = gVirtualX->PolygonRegion(gpoints, n, winding);
}

//_____________________________________________________________________________
TGRegion::TGRegion(Int_t n, Int_t *x, Int_t *y, Bool_t winding)
{
   // Create and initialize a region with an X and Y array of points.

   fData          = new TGRegionData;
   fData->fIsNull = kFALSE;
   Point_t *gpoints = new Point_t[n];

   for (int i = 0; i < n; i++) {
      gpoints[i].fX = x[i];
      gpoints[i].fY = y[i];
   }

   fData->fRgn = gVirtualX->PolygonRegion(gpoints, n, winding);
}

//______________________________________________________________________________
TGRegion::TGRegion(const TGRegion &r) : TObject(r)
{
   // Region copy constructor.

   fData = r.fData;
   fData->AddReference();
}

//______________________________________________________________________________
TGRegion::~TGRegion()
{
   // Delete a region.

   if (fData->RemoveReference() <= 0) {
      gVirtualX->DestroyRegion(fData->fRgn);
      delete fData;
   }
}

//______________________________________________________________________________
TGRegion &TGRegion::operator=(const TGRegion &r)
{
   // Region assignment operator.

   if (this != &r) {
      TObject::operator=(r);
      r.fData->AddReference();

      if (fData->RemoveReference() <= 0) {
         gVirtualX->DestroyRegion(fData->fRgn);
         delete fData;
      }
      fData = r.fData;
   }
   return *this;
}

//______________________________________________________________________________
TGRegion TGRegion::CopyRegion() const
{
   // Copy a region.

   TGRegion r(fData->fIsNull);
   gVirtualX->UnionRegion(fData->fRgn, r.fData->fRgn, r.fData->fRgn);
   return r;
}

//______________________________________________________________________________
Bool_t TGRegion::IsNull() const
{
   // Return true if region is not set.

   return fData->fIsNull;
}

//______________________________________________________________________________
Bool_t TGRegion::IsEmpty() const
{
   // Return true if region is empty.

   return fData->fIsNull || gVirtualX->EmptyRegion(fData->fRgn);
}

//______________________________________________________________________________
Bool_t TGRegion::Contains(const TPoint &p) const
{
   // Return true if point p is contained in the region.

   return gVirtualX->PointInRegion((Int_t)p.GetX(), (Int_t)p.GetY(), fData->fRgn);
}

//______________________________________________________________________________
Bool_t TGRegion::Contains(Int_t x, Int_t y) const
{
   // Return true if point (x,y) is contained in the region.

   return gVirtualX->PointInRegion(x, y, fData->fRgn);
}

//______________________________________________________________________________
TGRegion TGRegion::Unite(const TGRegion &r) const
{
   // Return the union of this region with r.

   TGRegion result(kFALSE);
   gVirtualX->UnionRegion(fData->fRgn, r.fData->fRgn, result.fData->fRgn);
   return result;
}

//______________________________________________________________________________
TGRegion TGRegion::Intersect(const TGRegion &r) const
{
   // Returns a region which is the intersection of this region and r.

   TGRegion result(kFALSE);
   gVirtualX->IntersectRegion(fData->fRgn, r.fData->fRgn, result.fData->fRgn);
   return result;
}

//______________________________________________________________________________
TGRegion TGRegion::Subtract(const TGRegion &r) const
{
   // Returns a region which is r subtracted from this region.

   TGRegion result(kFALSE);
   gVirtualX->SubtractRegion(fData->fRgn, r.fData->fRgn, result.fData->fRgn);
   return result;
}

//______________________________________________________________________________
TGRegion TGRegion::Eor(const TGRegion &r) const
{
   // Returns a region which is the difference between the union and
   // intersection this region and r.

   TGRegion result(kFALSE);
   gVirtualX->XorRegion(fData->fRgn, r.fData->fRgn, result.fData->fRgn);
   return result;
}

//______________________________________________________________________________
TGDimension TGRegion::GetDimension() const
{
   // Return dimension of region (widht, height).

   Rectangle_t r = { 0, 0, 0, 0 };
   gVirtualX->GetRegionBox(fData->fRgn, &r);
   return TGDimension(r.fWidth, r.fHeight);
}

//______________________________________________________________________________
TGPosition TGRegion::GetPosition() const
{
   // Return position of region (x, y).

   Rectangle_t r = { 0, 0, 0, 0 };
   gVirtualX->GetRegionBox(fData->fRgn, &r);
   return TGPosition(r.fX, r.fY);
}

//______________________________________________________________________________
Bool_t TGRegion::operator==(const TGRegion &r) const
{
   // Region == operator.

   return fData == r.fData ?
             kTRUE : gVirtualX->EqualRegion(fData->fRgn, r.fData->fRgn);
}


////////////////////////////////////////////////////////////////////////////////
//______________________________________________________________________________
TGRegionWithId::TGRegionWithId() : TGRegion()
{
   // Create GUI region (with id and possible tooltip).

   fId    = 0;
   fTip   = 0;
   fPopup = 0;
}

//______________________________________________________________________________
TGRegionWithId::TGRegionWithId(Int_t id, Int_t x, Int_t y,
                               UInt_t w, UInt_t h, ERegionType type) :
   TGRegion(x, y, w, h, type)
{
   // Create GUI region (with id and possible tooltip).

   fId    = id;
   fTip   = 0;
   fPopup = 0;
}

//______________________________________________________________________________
TGRegionWithId::TGRegionWithId(Int_t id, Int_t n, TPoint *points,
                               Bool_t winding) :
   TGRegion(n, points, winding)
{
   // Create GUI region (with id and possible tooltip).

   fId    = id;
   fTip   = 0;
   fPopup = 0;
}

//______________________________________________________________________________
TGRegionWithId::TGRegionWithId(const TGRegionWithId &reg) : TGRegion(reg)
{
   // Copy constructor.

   fId    = reg.GetId();
   fTip   = 0;
   fPopup = 0;
}

//______________________________________________________________________________
TGRegionWithId::TGRegionWithId(const TGRegion &reg, Int_t id) :
   TGRegion(reg)
{
   // Copy ctor which allows setting of new id.

   fId    = id;
   fTip   = 0;
   fPopup = 0;
}

//______________________________________________________________________________
TGRegionWithId::~TGRegionWithId()
{
   // Cleanup.

   delete fTip;
}

//______________________________________________________________________________
void TGRegionWithId::DisplayPopup()
{
   // Display popup menu associated with this region.

   if (fPopup) fPopup->PlaceMenu(gPointerX, gPointerY, kTRUE, kTRUE);
}

//______________________________________________________________________________
void TGRegionWithId::SetToolTipText(const char *text, Long_t delayms,
                                    const TGFrame *frame)
{
   // Set tool tip text associated with this region. The delay is in
   // milliseconds (minimum 250). To remove tool tip call method with
   // text = 0.

   if (fTip) {
      delete fTip;
      fTip = 0;
   }

   if (text && strlen(text))
      fTip = new TGToolTip(gClient->GetDefaultRoot(), frame, text, delayms);
}

////////////////////////////////////////////////////////////////////////////////
//______________________________________________________________________________
TGImageMap::TGImageMap(const TGWindow *p, const TGPicture *pic) :
   TGPictureButton(p, pic)
{
   // Create an image map widget.

   fCursorMouseOut  = kPointer;
   fCursorMouseOver = kHand;
   fListOfRegions   = new TList;
   fTrash           = new TList;
   fMainTip         = 0;
   fLastVisited     = 0;
   fNavMode = kNavRegions;

   SetDisabledPicture(fPic);
   SetState(kButtonDisabled);

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

   AddInput(kKeyPressMask | kKeyReleaseMask | kPointerMotionMask |
            kStructureNotifyMask | kLeaveWindowMask);
   SetWindowName();
}

//______________________________________________________________________________
TGImageMap::TGImageMap(const TGWindow *p, const TString &pic) :
   TGPictureButton(p, pic.Data())
{
   // Create an image map widget.

   fCursorMouseOut  = kPointer;
   fCursorMouseOver = kHand;
   fListOfRegions   = new TList;
   fTrash           = new TList;
   fMainTip         = 0;
   fLastVisited     = 0;
   fNavMode = kNavRegions;

   SetDisabledPicture(fPic);
   SetState(kButtonDisabled);

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

   AddInput(kKeyPressMask | kKeyReleaseMask | kPointerMotionMask |
            kStructureNotifyMask | kLeaveWindowMask);
   SetWindowName();
}

//______________________________________________________________________________
TGImageMap::~TGImageMap()
{
   // Cleanup image map widget.

   delete fMainTip;
   fTrash->Delete();
   delete fTrash;
   fListOfRegions->Delete();
   delete fListOfRegions;
}

//______________________________________________________________________________
void TGImageMap::AddRegion(const TGRegion &region, Int_t id)
{
   // Add a region to the image map.

   fListOfRegions->Add(new TGRegionWithId(region, id));
}

//______________________________________________________________________________
TGPopupMenu *TGImageMap::CreatePopup(Int_t id)
{
   // Create popoup menu or returns existing for regions with specified id.

   TIter next(fListOfRegions);
   TGRegionWithId *region;
   TGPopupMenu    *popup = 0;
   TGPopupMenu    *newpopup = 0;

   while ((region = (TGRegionWithId*)next())) {
      if (id == region->GetId()) {
         popup = region->GetPopup();
         if (!popup && !newpopup) {
            newpopup = new TGPopupMenu(this);
            fTrash->Add(newpopup);
         }
         if (newpopup) region->SetPopup(newpopup);
      }
   }
   return newpopup ? newpopup : popup;
}

//______________________________________________________________________________
TGPopupMenu *TGImageMap::GetPopup(Int_t id)
{
   // Return popup for regions with specified id.

   TIter next(fListOfRegions);
   TGRegionWithId *region;

   while ((region = (TGRegionWithId*)next())) {
      if (id == region->GetId()) return region->GetPopup();
   }
   return 0;
}

//______________________________________________________________________________
Bool_t TGImageMap::HandleMotion(Event_t *event)
{
   // Handle mouse motion events.

   TIter next(fListOfRegions);
   TGRegionWithId *region;

   if (fNavMode != kNavRegions) return kTRUE;
   gPointerX = event->fX;
   gPointerY = event->fY;

   while ((region = (TGRegionWithId*)next())) {
      if (region->Contains(gPointerX, gPointerY)) {
         if (fLastVisited == region->GetId()) return kTRUE;
         if (fLastVisited) OnMouseOut(fLastVisited);
         fLastVisited = region->GetId();
         fTip = region->GetToolTipText();
         gCurrentRegion = region;
         OnMouseOver(fLastVisited);
         return kTRUE;
      }
   }

   if (fLastVisited) {
      OnMouseOut(fLastVisited);
      fTip = fMainTip;
   }
   fLastVisited = 0;  // main
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGImageMap::HandleDoubleClick(Event_t *event)
{
   // Handle double click events.

   TIter next(fListOfRegions);
   TGRegionWithId *region;

   if (fTip) fTip->Hide();
   if (event->fCode != kButton1 ) return kTRUE;
   if (fNavMode != kNavRegions) return kTRUE;

   gPointerX = event->fX;
   gPointerY = event->fY;

   while ((region = (TGRegionWithId*)next())) {
      if (region->Contains(gPointerX, gPointerY)) {
         DoubleClicked(region->GetId());
         gCurrentRegion = region;
         return kTRUE;
      }
   }
   DoubleClicked();
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGImageMap::HandleButton(Event_t *event)
{
   // Handle button events.

   TIter next(fListOfRegions);
   TGRegionWithId *region;
   TGPopupMenu *pop;

   if (fTip) fTip->Hide();
   if (fNavMode != kNavRegions) return kTRUE;

   gPointerX = event->fX;
   gPointerY = event->fY;

   while ((region = (TGRegionWithId*)next())) {
      if (region->Contains(gPointerX, gPointerY)) {
         gCurrentRegion = region;
         if (event->fType == kButtonPress) {
            if (event->fCode == kButton1 )
               RegionClicked(region->GetId());
            else if (event->fCode == kButton3 ) {
               pop = region->GetPopup();
               if (pop) pop->PlaceMenu(gPointerX, gPointerY, kTRUE, kTRUE);
            }
         }
         return kTRUE;
      }
   }
   if (event->fType == kButtonPress)
      Clicked();
   return kTRUE;
}

//______________________________________________________________________________
void TGImageMap::SetToolTipText(const char *text, Long_t delayms)
{
   // Set tooltip text for main region.

   if (fMainTip) delete fMainTip;
   fMainTip = 0;

   if (text && strlen(text))
      fMainTip = new TGToolTip(fClient->GetDefaultRoot(), this, text, delayms);
}

//______________________________________________________________________________
void TGImageMap::SetToolTipText(Int_t id, const char *text, Long_t delayms)
{
   // Set tooltip text for regions with specified id.

   TIter next(fListOfRegions);
   TGRegionWithId *region;

   while ((region = (TGRegionWithId*)next())) {
      if (id == region->GetId())
         region->SetToolTipText(text, delayms, this);
   }
}

//______________________________________________________________________________
void TGImageMap::OnMouseOver(Int_t id)
{
   // Handle when mouse moves over region id. Emits signal
   // OnMouseOver(Int_t).

   if (fTip) fTip->Reset();
   if (fMainTip) fMainTip->Hide();
   gVirtualX->SetCursor(fId, gVirtualX->CreateCursor(fCursorMouseOver));
   Emit("OnMouseOver(Int_t)", id);
}

//______________________________________________________________________________
void TGImageMap::OnMouseOut(Int_t id)
{
   // Handle when mouse moves from region id. Emits signal
   // OnMouseOut(Int_t).

   if(fTip) fTip->Hide();
   if(fMainTip) fMainTip->Reset();
   gVirtualX->SetCursor(fId,gVirtualX->CreateCursor(fCursorMouseOut));
   Emit("OnMouseOut(Int_t)",id);
}

//______________________________________________________________________________
void TGImageMap::RegionClicked(Int_t id)
{
   // Handle when mouse was clicked on region id. Emits signal
   // RegionClicked(Int_t).

   Emit("RegionClicked(Int_t)",id);
}

//______________________________________________________________________________
void TGImageMap::DoubleClicked()
{
   // Handle when mouse is double clicked on main map. Emits signal
   // DoubleClicked().

   Emit("DoubleClicked()");
}

//______________________________________________________________________________
void TGImageMap::DoubleClicked(Int_t id)
{
   // Handle when mouse is double clicked on region id. Emits signal
   // DoubleClicked(Int_t).

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