// @(#)root/ged:$Id$
// Author: Carsten Hof   16/08/04

/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/


//////////////////////////////////////////////////////////////////////////
//                                                                      //
//  TGraphEditor                                                        //
//                                                                      //
//  Implements GUI for graph attributes.                                //
//                                                                      //
//  Title': set the title of the graph                                  //
//  Change the Shape of the graph:                                      //
//     'No Line'     = " ": just draw unconnected points                //
//     'Simple Line' = "L":simple poly line between every point is drawn//
//     'Smooth Line' = "C":smooth curve is drawn                        //
//     'Bar Chart'   = "B": A bar chart is drawn at each point          //
//     'Fill Area'   = "F": A fill area is drawn                        //
//  Check box: 'Marker On/Off' Set Marker visible/invisible             //
//                                                                      //
//////////////////////////////////////////////////////////////////////////
//Begin_Html
/*
<img src="gif/TGraphEditor.gif">
*/
//End_Html

#include "TGComboBox.h"
#include "TGButtonGroup.h"
#include "TGraphEditor.h"
#include "TGTextEntry.h"
#include "TGToolTip.h"
#include "TGLabel.h"
#include "TGraph.h"
#include "TVirtualPad.h"
#include "TGraphErrors.h"

ClassImp(TGraphEditor)

enum EGraphWid {
   kShape = 0,
   kSHAPE_NOLINE,
   kSHAPE_SMOOTH,
   kSHAPE_SIMPLE,
   kSHAPE_BAR,
   kSHAPE_FILL,
   kMARKER_ONOFF,
   kGRAPH_TITLE,
   kGRAPH_LINE_WIDTH,
   kGRAPH_LINE_SIDE
};

//______________________________________________________________________________

TGraphEditor::TGraphEditor(const TGWindow *p, Int_t width,
                         Int_t height, UInt_t options, Pixel_t back)
   : TGedFrame(p, width, height, options | kVerticalFrame, back)
{
   // Constructor of graph editor.

   fGraph = 0;
   // TextEntry to change the title
   MakeTitle("Title");

   fTitlePrec = 2;
   fTitle = new TGTextEntry(this, new TGTextBuffer(50), kGRAPH_TITLE);
   fTitle->Resize(135, fTitle->GetDefaultHeight());
   fTitle->SetToolTipText("Enter the graph title string");
   // better take kLHintsLeft and Right - Right is not working at the moment
   AddFrame(fTitle, new TGLayoutHints(kLHintsLeft, 3, 1, 2, 5));

   // Radio Buttons to change the draw options of the graph
   TGCompositeFrame *f2 = new TGCompositeFrame(this, 80, 20, kVerticalFrame);
   fgr = new TGButtonGroup(f2,3,1,3,5,"Shape");
   fgr->SetRadioButtonExclusive(kTRUE);
   fShape = new TGRadioButton(fgr,"No Line",kSHAPE_NOLINE);   // no draw option
   fShape->SetToolTipText("The points are not connected by a line");
   fShape0 = new TGRadioButton(fgr,"Smooth Line  ",kSHAPE_SMOOTH);  // option C
   fShape0->SetToolTipText("Draw a smooth graph curve");
   fShape1 = new TGRadioButton(fgr,"Simple Line   ",kSHAPE_SIMPLE); // option L
   fShape1->SetToolTipText("Draw a simple poly-line between the graph points");
   fShape2 = new TGRadioButton(fgr,"Bar Chart",kSHAPE_BAR);         // option B
   fShape2->SetToolTipText("Draw a bar chart at each graph point");
   fShape3 = new TGRadioButton(fgr,"Fill area",kSHAPE_FILL);        // option F
   fShape3->SetToolTipText("A fill area is drawn");

   fgr->SetLayoutHints(fShape1lh=new TGLayoutHints(kLHintsLeft, 0,3,0,0), fShape1);
   fgr->Show();
   fgr->ChangeOptions(kFitWidth|kChildFrame|kVerticalFrame);
   f2->AddFrame(fgr, new TGLayoutHints(kLHintsLeft, 4, 0, 0, 0));

   // CheckBox to activate/deactivate the drawing of the Marker
   fMarkerOnOff = new TGCheckButton(f2,"Show Marker",kMARKER_ONOFF);
   fMarkerOnOff->SetToolTipText("Make Marker visible/invisible");
   f2->AddFrame(fMarkerOnOff, new TGLayoutHints(kLHintsTop, 5, 1, 0, 3));
   AddFrame(f2, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));

   // Exclusion zone parameters
   MakeTitle("Exclusion Zone");
   TGCompositeFrame *f3 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
   AddFrame(f3, new TGLayoutHints(kLHintsTop, 1, 1, 5, 0));

   fExSide = new TGCheckButton(f3,"+-",kGRAPH_LINE_SIDE);
   fExSide->SetToolTipText("Zone is drawing side");
   f3->AddFrame(fExSide, new TGLayoutHints(kLHintsTop, 5, 1, 0, 0));

   fWidthCombo = new TGLineWidthComboBox(f3, kGRAPH_LINE_WIDTH,
                                         kHorizontalFrame | kSunkenFrame | kDoubleBorder,
                                         GetWhitePixel(), kTRUE);
   fWidthCombo->Resize(91, 20);
   f3->AddFrame(fWidthCombo, new TGLayoutHints(kLHintsLeft, 7, 1, 1, 1));
   fWidthCombo->Associate(f3);
}

//______________________________________________________________________________

TGraphEditor::~TGraphEditor()
{
   // Destructor of graph editor.

   // children of TGButonGroup are not deleted
   delete fShape;
   delete fShape0;
   delete fShape1;
   delete fShape2;
   delete fShape3;
   delete fShape1lh;
}

//______________________________________________________________________________

void TGraphEditor::ConnectSignals2Slots()
{
   // Connect signals to slots.

   fTitle->Connect("TextChanged(const char *)","TGraphEditor",this,"DoTitle(const char *)");
   fgr->Connect("Clicked(Int_t)","TGraphEditor",this,"DoShape()");
   fMarkerOnOff->Connect("Toggled(Bool_t)","TGraphEditor",this,"DoMarkerOnOff(Bool_t)");
   fWidthCombo->Connect("Selected(Int_t)", "TGraphEditor", this, "DoGraphLineWidth()");
   fExSide->Connect("Clicked()","TGraphEditor",this,"DoGraphLineWidth()");

   fInit = kFALSE;  // connect the slots to the signals only once
}

//______________________________________________________________________________

void TGraphEditor::SetModel(TObject* obj)
{
   // Pick up the used values of graph attributes.

   fGraph = (TGraph *)obj;
   fAvoidSignal = kTRUE;

   // set the Title TextEntry
   const char *text = fGraph->GetTitle();
   fTitle->SetText(text);

   TString opt = GetDrawOption();
   opt.ToUpper();
   Int_t i=0;
   Bool_t make=kFALSE;
   // Remove characters which appear twice in the draw option
   TString dum  = opt;
   Int_t l = opt.Length()-1;
   while (i < l) {
      dum.Remove(dum.First(opt[i]),1);
      if (dum.Contains(opt[i])){
         opt.Remove(opt.First(opt[i]),1);
         l--;
         i--;
         make=kTRUE;
      }
      i++;
   }
   // initialise the RadioButton group which shows the drawoption
   if (opt.Contains("C")) {
      fgr->SetButton(kSHAPE_SMOOTH, kTRUE);
      fDrawShape='C';
   } else if (opt.Contains("L")) {
      fgr->SetButton(kSHAPE_SIMPLE, kTRUE);
      fDrawShape='L';
   } else if (opt.Contains("B")){
      fgr->SetButton(kSHAPE_BAR, kTRUE);
      fDrawShape='B';
   } else if (opt.Contains("F")){
      fgr->SetButton(kSHAPE_FILL, kTRUE);
      fDrawShape='F';
   } else {
      fgr->SetButton(kSHAPE_NOLINE, kTRUE);
      fDrawShape=' ';
   }
   if (make) SetDrawOption(opt);
   // if the draw option is A, P, AP the P option cannot be removed,
   // we deactivate the CheckBox
   // also initialising the MarkerOnOff checkbutton (== P option)
   if (opt=="A" || opt=="AP" || opt=="PA" || opt == "P") {
      if (!opt.Contains("P"))
         opt +="P";
      fMarkerOnOff->SetState(kButtonDisabled);
   } else if (opt.Contains("P")) {
      fMarkerOnOff->SetState(kButtonDown);
   } else fMarkerOnOff->SetState(kButtonUp);

   // Exclusion zone parameters
   if (fGraph->GetLineWidth()<0) fExSide->SetState(kButtonDown, kFALSE);
   else fExSide->SetState(kButtonUp, kFALSE);
   fWidthCombo->Select(TMath::Abs(Int_t(fGraph->GetLineWidth()/100)), kFALSE);

   if (fInit) ConnectSignals2Slots();
   fAvoidSignal = kFALSE;
}

//______________________________________________________________________________

void TGraphEditor::DoTitle(const char *text)
{
   // Slot for setting the graph title.

   if (fAvoidSignal) return;
   fGraph->SetTitle(text);
   Update();
}

//______________________________________________________________________________

void TGraphEditor::DoShape()
{
   // Slot connected to the draw options.

   if (fAvoidSignal) return;
   TString opt;
   if (fGraph->InheritsFrom(TGraphErrors::Class()))
      opt = fGraph->GetDrawOption();
   else
      opt = GetDrawOption();

   opt.ToUpper();
   Int_t s = 0;
   if (fShape->GetState() == kButtonDown) s = kSHAPE_NOLINE;
   else if (fShape0->GetState() == kButtonDown) s = kSHAPE_SMOOTH;
   else if (fShape1->GetState() == kButtonDown) s = kSHAPE_SIMPLE;
   else if (fShape2->GetState() == kButtonDown) s = kSHAPE_BAR;
   else s = kSHAPE_FILL;

   switch (s) {

      // change draw option to No Line:
      case kSHAPE_NOLINE: {
         if (opt.Contains(fDrawShape))
            opt.Remove(opt.First(fDrawShape),1);
         fDrawShape = ' ';
         fMarkerOnOff->SetState(kButtonDisabled);
         break;
      }

      // change draw option to Smooth Line (C)
      case kSHAPE_SMOOTH: {
         if (fDrawShape == ' ')
            opt +="C";
         else if (opt.Contains(fDrawShape))
            opt.Replace(opt.First(fDrawShape),1,'C');
         fDrawShape = 'C';
         break;
      }

      // change draw option to Simple Line (L)
      case kSHAPE_SIMPLE: {
         if (fDrawShape == ' ')
            opt +="L";
         else if (opt.Contains(fDrawShape))
            opt.Replace(opt.First(fDrawShape),1,'L');
         fDrawShape='L';
         break;
      }

      // change draw option to Bar Chart (B)
      case kSHAPE_BAR: {
         if (fDrawShape == ' ')
            opt +="B";
         else if (opt.Contains(fDrawShape))
            opt.Replace(opt.First(fDrawShape),1,'B');
         fDrawShape='B';
         break;
      }

      // change draw option to Fill Area (F)
      case kSHAPE_FILL: {
         if (fDrawShape == ' ')
            opt +="F";
         else if (opt.Contains(fDrawShape))
            opt.Replace(opt.First(fDrawShape),1,'F');
         fDrawShape='F';
         break;
      }
   }

   if (gPad && gPad->GetVirtCanvas())
      gPad->GetVirtCanvas()->SetCursor(kWatch);
   gVirtualX->SetCursor(GetId(), gVirtualX->CreateCursor(kWatch));

   // set/reset the Marker CheckBox
   if (opt.Contains("P"))
      fMarkerOnOff->SetState(kButtonDown);
   else
      fMarkerOnOff->SetState(kButtonUp);
   if (opt=="A" || opt=="AP" || opt=="PA" || opt == "P") {
      if (!opt.Contains("P"))
         opt +="P";
      fMarkerOnOff->SetState(kButtonDisabled);
   }

   // set/reset the exclusion zone CheckBox
   if (opt.Contains("L") || opt.Contains("C")) {
      if (fGraph->GetLineWidth()<0) fExSide->SetState(kButtonDown, kFALSE);
      else fExSide->SetState(kButtonUp, kFALSE);
      fWidthCombo->SetEnabled(kTRUE);
   } else {
      fExSide->SetState(kButtonDisabled);
      fWidthCombo->SetEnabled(kFALSE);
   }

   SetDrawOption(opt);
   if (gPad && gPad->GetVirtCanvas())
      gPad->GetVirtCanvas()->SetCursor(kPointer);
   gVirtualX->SetCursor(GetId(), gVirtualX->CreateCursor(kPointer));
}

//______________________________________________________________________________

void TGraphEditor::DoMarkerOnOff(Bool_t on)
{
   // Slot for setting markers as visible/invisible.

   if (fAvoidSignal) return;
   TString t = GetDrawOption();
   t.ToUpper();

   // showing the marker:
   if (on) {
      if  (!t.Contains("P")) t+="P";
      fShape->SetState(kButtonEngaged);
   } else {
      // remove the marker option P
      while (t.Contains("P")) t.Remove(t.First("P"),1);
      fShape->SetState(kButtonDisabled);
   }
   SetDrawOption(t);
}

//______________________________________________________________________________

void TGraphEditor::DoGraphLineWidth()
{
   // Slot connected to the graph line width.

   if (fAvoidSignal) return;
   Int_t width = fWidthCombo->GetSelected();
   Int_t lineWidth = TMath::Abs(fGraph->GetLineWidth()%100);
   Int_t side = 1;
   if (fExSide->GetState() == kButtonDown) side = -1;
   fGraph->SetLineWidth(side*(100*width+lineWidth));
   Update();
}

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