ROOT logo
//  This macro shows how to use a TGImageMap class.
//
// A TGImageMap provides the functionality like a clickable image in    
// with sensitive regions (similar to MAP HTML tag).                 
//Author: Valeriy Onuchin                                                                    

#include <TGPicture.h>
#include <TGMenu.h>
#include <TGImageMap.h>
#include <TGMsgBox.h>
#include <TGClient.h>

////////////////////////////////////////////////////////////////////////////////
class WorldMap
{
protected:
   TGMainFrame*      fMain;      // main frame
   TGImageMap*       fImageMap;  // image map

   virtual void InitMap();
   virtual void InitRU();
   virtual void InitUS();
//   virtual void InitCN();
   virtual void InitAU();
   virtual void InitFR();
   virtual void InitUK();

public:
   // the name corresponds to TLD code (http://www.iana.org/cctld/cctld-whois.htm)
   // the value to "country phone code" (http://www.att.com/traveler/tools/codes.html)
   enum ECountryCode {
      kRU = 7, kUS = 1, kFR = 33, kDE = 49, kCH = 41, kCN = 86, kAU = 61,
      kUK = 44, kUA = 380, kBR = 55
    };

   WorldMap(const char *picName = "worldmap.jpg");
   virtual ~WorldMap() {}

   virtual void Show() { fMain->MapRaised(); }
   TGImageMap* GetImageMap() const { return fImageMap; }
   virtual TString GetTitle() const;

   // slots
   void PrintCode(Int_t code);
};


//__________________________________________________________________________
WorldMap::WorldMap(const char* picName)
{
   //

   fMain = new TGMainFrame(gClient->GetRoot(), 750, 420);

   fImageMap = new TGImageMap(fMain, picName);
   fMain->AddFrame(fImageMap);
   fMain->SetWindowName(GetTitle().Data());
   fMain->SetIconName("World Map");

   TGDimension size = fMain->GetDefaultSize();
   fMain->Resize(size);
   fMain->MapSubwindows();
   InitMap();

   fImageMap->Connect("RegionClicked(Int_t)", "WorldMap", this, "PrintCode(Int_t)");
}

//__________________________________________________________________________
TString WorldMap::GetTitle() const
{
   // title

   return "Country Code (left button). City/Area Codes (right button)";
}

//__________________________________________________________________________
void WorldMap::InitRU()
{
   //

   int x[12] = { 403, 406, 427, 444, 438, 470, 508, 568, 599, 632, 645, 493 };
   int y[12] = { 68, 90, 120, 125, 109, 94, 109, 101, 122, 107, 74, 46 };
   TGRegion reg(12, x, y);
   fImageMap->AddRegion(reg, kRU);
   fImageMap->SetToolTipText(kRU, "Russia");
   TGPopupMenu* pm = fImageMap->CreatePopup(kRU);
   pm->AddLabel("City Codes");
   pm->AddSeparator();
   pm->AddEntry("Moscow = 095", 95);
   pm->AddEntry("Protvino = 0967", 967);
   pm->AddEntry("St.Petersburg = 812", 812);
}

//__________________________________________________________________________
void WorldMap::InitUS()
{
   //

   int x[5] = { 136, 122, 165, 194, 232 };
   int y[5] = { 110, 141, 158, 160, 118 };
   TGRegion reg(5, x, y);
   fImageMap->AddRegion(reg, kUS);

   int alaskaX[4] = { 86, 131, 154, 117 };
   int alaskaY[4] = { 90, 82, 64, 63 };
   TGRegion alaska(4, alaskaX, alaskaY);
   fImageMap->AddRegion(alaska, kUS);
   fImageMap->SetToolTipText(kUS, "USA");

   TGPopupMenu* pm = fImageMap->CreatePopup(kUS);
   pm->AddLabel("Area Codes");
   pm->AddSeparator();
   pm->AddEntry("Illinois = 217", 217);
   pm->AddEntry("New York = 212", 212);
}

//__________________________________________________________________________
void WorldMap::InitFR()
{
   //

   int x[5] = { 349, 353, 368, 368, 358 };
   int y[5] = { 112, 123, 119, 108, 107 };
   TGRegion reg(5, x, y);
   fImageMap->AddRegion(reg, kFR);
   fImageMap->SetToolTipText(kFR, "France");
}

//__________________________________________________________________________
void WorldMap::InitUK()
{
   //

   int x[4] = { 346, 348, 359, 352 };
   int y[4] = { 93, 104, 103, 87 };
   TGRegion reg(4, x, y);
   fImageMap->AddRegion(reg, kUK);
   fImageMap->SetToolTipText(kUK, "United Kingdom");
}

//__________________________________________________________________________
void WorldMap::InitAU()
{
   //

   int x[6] = { 582, 576, 634, 658, 641, 607 };
   int y[6] = { 271, 300, 310, 283, 251, 253 };
   TGRegion reg(6, x, y);
   fImageMap->AddRegion(reg, kAU);
   fImageMap->SetToolTipText(kAU, "Australia");
}

//__________________________________________________________________________
void WorldMap::InitMap()
{
   //

   InitRU();
   InitUS();
   InitFR();
   InitAU();
   InitUK();
   fImageMap->SetToolTipText(GetTitle().Data(), 300);
}

//__________________________________________________________________________
void WorldMap::PrintCode(Int_t code)
{
   //

   EMsgBoxIcon icontype = kMBIconAsterisk;
   Int_t buttons = 0;
   Int_t retval;

   TGMsgBox* box = new TGMsgBox(gClient->GetRoot(), fMain,
                              "Country Code", Form("Country Code=%d",code),
                              icontype, buttons, &retval);
}

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