// @(#)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.             *
 *************************************************************************/

#ifndef ROOT_TGImageMap
#define ROOT_TGImageMap

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// 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 "TGButton.h"
#include "TPoint.h"
#include "TGDimension.h"


class TGRegionData;
class TGPopupMenu;
class TGToolTip;
class TArrayS;


class TGRegion : public TObject {

protected:
   TGRegionData   *fData;  // data describing region

   TGRegion(Bool_t);
   TGRegion CopyRegion() const;

public:
   enum ERegionType { kRectangle, kEllipse };

   TGRegion();
   TGRegion(Int_t x, Int_t y, UInt_t w, UInt_t h, ERegionType = kRectangle);
   TGRegion(Int_t n, TPoint *points, Bool_t winding = kFALSE);
   TGRegion(Int_t n, Int_t *x, Int_t *y, Bool_t winding = kFALSE);
   TGRegion(const TArrayS &x, const TArrayS &y, Bool_t winding = kFALSE);
   TGRegion(const TGRegion &reg);
   virtual ~TGRegion();

   Bool_t      Contains(const TPoint &p) const;
   Bool_t      Contains(Int_t x, Int_t y) const;
   TGRegion    Unite(const TGRegion &r) const;
   TGRegion    Intersect(const TGRegion &r) const;
   TGRegion    Subtract(const TGRegion &r) const;
   TGRegion    Eor(const TGRegion &r) const;
   TGDimension GetDimension() const;
   TGPosition  GetPosition() const;
   Bool_t      IsNull() const;
   Bool_t      IsEmpty() const;

   TGRegion operator|(const TGRegion &r) const { return Unite(r); }
   TGRegion operator+(const TGRegion &r) const { return Unite(r); }
   TGRegion operator&(const TGRegion &r) const { return Intersect(r); }
   TGRegion operator-(const TGRegion &r) const { return Subtract(r); }
   TGRegion operator^(const TGRegion &r) const { return Eor(r); }
   TGRegion& operator|=(const TGRegion &r) { return *this = *this | r; }
   TGRegion& operator+=(const TGRegion &r) { return *this = *this + r; }
   TGRegion& operator&=(const TGRegion &r) { return *this = *this & r; }
   TGRegion& operator-=(const TGRegion &r) { return *this = *this - r; }
   TGRegion& operator^=(const TGRegion &r) { return *this = *this ^ r; }
   Bool_t operator==(const TGRegion &r)  const;
   Bool_t operator!=(const TGRegion &r) const { return !(operator==(r)); }
   TGRegion &operator=(const TGRegion &r);

   ClassDef(TGRegion,0) // Describes a region
};


class TGRegionWithId : public TGRegion {

private:

   TGRegionWithId& operator=(const TGRegionWithId&); // Not implemented

protected:
   Int_t         fId;      // region id
   TGToolTip    *fTip;     // tooltip
   TGPopupMenu  *fPopup;   // popup menu

public:
   TGRegionWithId();
   TGRegionWithId(Int_t id, Int_t x, Int_t y, UInt_t w, UInt_t h,
                  ERegionType = kRectangle);
   TGRegionWithId(Int_t id, Int_t n, TPoint *points, Bool_t winding = kFALSE);
   TGRegionWithId(const TGRegionWithId &reg);
   TGRegionWithId(const TGRegion &reg, Int_t id);
   virtual ~TGRegionWithId();

   Int_t        GetId() const { return fId; }
   TGToolTip   *GetToolTipText() const { return fTip; }
   void         SetToolTipText(const char *text, Long_t delayms,
                               const TGFrame *frame);
   TGPopupMenu *GetPopup() const { return fPopup; }
   void         SetPopup(TGPopupMenu *popup) { fPopup = popup; }
   void         DisplayPopup();

   ClassDef(TGRegionWithId,0) // Region with id, tooltip text and popup menu
};


class TGImageMap : public TGPictureButton {

private:

   TGImageMap(const TGImageMap&); // Not implemented
   TGImageMap& operator=(const TGImageMap&); // Not implemented

public:
   enum ENavMode { kNavRegions, kNavGrid };

protected:
   TList      *fListOfRegions;   // list of regions
   ENavMode    fNavMode;         // navigation mode
   ECursor     fCursorMouseOver; // cursor shape in regions
   ECursor     fCursorMouseOut;  // cursor shape out of regions
   Int_t       fLastVisited;     // id of the last visited region
   TGToolTip  *fMainTip;         // tooltip text for main region
   TList      *fTrash;           // collect all objects that need to be cleaned up

public:
   TGImageMap(const TGWindow *p = 0, const TGPicture *pic = 0);
   TGImageMap(const TGWindow *p, const TString &pic);
   virtual ~TGImageMap();

   virtual Bool_t HandleButton(Event_t *event);
   virtual Bool_t HandleDoubleClick(Event_t *event);
   virtual Bool_t HandleMotion(Event_t *event);

   ENavMode       GetNavMode() { return fNavMode; }
   void           AddRegion(const TGRegion &region, Int_t id);
   TGPopupMenu   *CreatePopup(Int_t id);
   TGPopupMenu   *GetPopup(Int_t id);

   void SetToolTipText(const char *text, Long_t delayms = 300);
   void SetToolTipText(Int_t id, const char *text, Long_t delayms = 300);
   void SetCursor(ECursor cursor = kHand) { fCursorMouseOver = cursor; }
   void SetPicture(const TGPicture * /*new_pic*/) { } // disabled

   virtual void RegionClicked(Int_t id); // *SIGNAL*
   virtual void DoubleClicked(Int_t id); // *SIGNAL*
   virtual void DoubleClicked();         // *SIGNAL*
   virtual void OnMouseOver(Int_t id);   // *SIGNAL*
   virtual void OnMouseOut(Int_t id);    // *SIGNAL*

   ClassDef(TGImageMap,0)  // Clickable image (like MAP in HTML)
};

R__EXTERN TGRegionWithId *gCurrentRegion;

#endif
 TGImageMap.h:1
 TGImageMap.h:2
 TGImageMap.h:3
 TGImageMap.h:4
 TGImageMap.h:5
 TGImageMap.h:6
 TGImageMap.h:7
 TGImageMap.h:8
 TGImageMap.h:9
 TGImageMap.h:10
 TGImageMap.h:11
 TGImageMap.h:12
 TGImageMap.h:13
 TGImageMap.h:14
 TGImageMap.h:15
 TGImageMap.h:16
 TGImageMap.h:17
 TGImageMap.h:18
 TGImageMap.h:19
 TGImageMap.h:20
 TGImageMap.h:21
 TGImageMap.h:22
 TGImageMap.h:23
 TGImageMap.h:24
 TGImageMap.h:25
 TGImageMap.h:26
 TGImageMap.h:27
 TGImageMap.h:28
 TGImageMap.h:29
 TGImageMap.h:30
 TGImageMap.h:31
 TGImageMap.h:32
 TGImageMap.h:33
 TGImageMap.h:34
 TGImageMap.h:35
 TGImageMap.h:36
 TGImageMap.h:37
 TGImageMap.h:38
 TGImageMap.h:39
 TGImageMap.h:40
 TGImageMap.h:41
 TGImageMap.h:42
 TGImageMap.h:43
 TGImageMap.h:44
 TGImageMap.h:45
 TGImageMap.h:46
 TGImageMap.h:47
 TGImageMap.h:48
 TGImageMap.h:49
 TGImageMap.h:50
 TGImageMap.h:51
 TGImageMap.h:52
 TGImageMap.h:53
 TGImageMap.h:54
 TGImageMap.h:55
 TGImageMap.h:56
 TGImageMap.h:57
 TGImageMap.h:58
 TGImageMap.h:59
 TGImageMap.h:60
 TGImageMap.h:61
 TGImageMap.h:62
 TGImageMap.h:63
 TGImageMap.h:64
 TGImageMap.h:65
 TGImageMap.h:66
 TGImageMap.h:67
 TGImageMap.h:68
 TGImageMap.h:69
 TGImageMap.h:70
 TGImageMap.h:71
 TGImageMap.h:72
 TGImageMap.h:73
 TGImageMap.h:74
 TGImageMap.h:75
 TGImageMap.h:76
 TGImageMap.h:77
 TGImageMap.h:78
 TGImageMap.h:79
 TGImageMap.h:80
 TGImageMap.h:81
 TGImageMap.h:82
 TGImageMap.h:83
 TGImageMap.h:84
 TGImageMap.h:85
 TGImageMap.h:86
 TGImageMap.h:87
 TGImageMap.h:88
 TGImageMap.h:89
 TGImageMap.h:90
 TGImageMap.h:91
 TGImageMap.h:92
 TGImageMap.h:93
 TGImageMap.h:94
 TGImageMap.h:95
 TGImageMap.h:96
 TGImageMap.h:97
 TGImageMap.h:98
 TGImageMap.h:99
 TGImageMap.h:100
 TGImageMap.h:101
 TGImageMap.h:102
 TGImageMap.h:103
 TGImageMap.h:104
 TGImageMap.h:105
 TGImageMap.h:106
 TGImageMap.h:107
 TGImageMap.h:108
 TGImageMap.h:109
 TGImageMap.h:110
 TGImageMap.h:111
 TGImageMap.h:112
 TGImageMap.h:113
 TGImageMap.h:114
 TGImageMap.h:115
 TGImageMap.h:116
 TGImageMap.h:117
 TGImageMap.h:118
 TGImageMap.h:119
 TGImageMap.h:120
 TGImageMap.h:121
 TGImageMap.h:122
 TGImageMap.h:123
 TGImageMap.h:124
 TGImageMap.h:125
 TGImageMap.h:126
 TGImageMap.h:127
 TGImageMap.h:128
 TGImageMap.h:129
 TGImageMap.h:130
 TGImageMap.h:131
 TGImageMap.h:132
 TGImageMap.h:133
 TGImageMap.h:134
 TGImageMap.h:135
 TGImageMap.h:136
 TGImageMap.h:137
 TGImageMap.h:138
 TGImageMap.h:139
 TGImageMap.h:140
 TGImageMap.h:141
 TGImageMap.h:142
 TGImageMap.h:143
 TGImageMap.h:144
 TGImageMap.h:145
 TGImageMap.h:146
 TGImageMap.h:147
 TGImageMap.h:148
 TGImageMap.h:149
 TGImageMap.h:150
 TGImageMap.h:151
 TGImageMap.h:152
 TGImageMap.h:153
 TGImageMap.h:154
 TGImageMap.h:155
 TGImageMap.h:156
 TGImageMap.h:157
 TGImageMap.h:158
 TGImageMap.h:159
 TGImageMap.h:160
 TGImageMap.h:161
 TGImageMap.h:162
 TGImageMap.h:163
 TGImageMap.h:164