ROOT logo
// @(#)root/memstat:$Name$:$Id: TMemStatViewerGUI.cxx 24658 2008-07-04 09:06:58Z anar $
// Author: M.Ivanov -- Anar Manafov (A.Manafov@gsi.de) 28/04/2008

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


///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//  GUI for the TMemStat                                                     //
//  used for the memory checker                                             //
//  Example usage:                                                           //
/*
  aliroot
  TMemStatViewer::ShowGUI("memstat.root")
*/
// - Resize windows - (BUG to BE FIXED -> ROOT bug)                          //
//                                                                           //
//////////////////////////////////////////////////////////////////////////////

// STD
#include <functional>
#include <stdexcept>
#include <algorithm>
// ROOT
#include "TGTextView.h"
#include "TGLabel.h"
#include "TGTab.h"
#include "TGButton.h"
#include "TGNumberEntry.h"
#include "TGSplitter.h"
#include "TGButtonGroup.h"
#include "TGComboBox.h"
#include "TObjArray.h"
// Memstat
#include "TMemStat.h"
#include "TMemStatViewerGUI.h"
#include "TMemStatResource.h"
#include "TMemStatDrawDlg.h"

ClassImp(TMemStatViewerGUI)

using namespace std;


//______________________________________________________________________________
struct SStringToListBox_t : public binary_function<string, TGComboBox*, bool> {
   bool operator()(string str, TGComboBox* box) const {
      if (!box)
         return false;

      box->AddEntry(str.c_str(), box->GetNumberOfEntries());
      return true;
   }
};

//______________________________________________________________________________
struct SFillListBox_t : public binary_function<TObject*, TGComboBox*, bool> {
   bool operator()(TObject *aObj, TGComboBox* box) const {
      if (!aObj || !box)
         return false; //TODO: need an assert "SFillListBox_t: parameter is a NULL pointer"

      if ((aObj->IsA() == TObjString::Class())) {
         TObjString *str(dynamic_cast<TObjString*>(aObj));
         if (!str)
            return false; // TODO: need an assert "SFillListBox_t: Container's element is not a TObjString object."

         SStringToListBox_t()(str->String().Data(), box);
      }

      return true;
   }
};

//______________________________________________________________________________
TMemStatViewerGUI::TMemStatViewerGUI(const TGWindow *p, UInt_t w, UInt_t h, Option_t* option):
      TGCompositeFrame(p, w, h),
      fViewer(NULL),
      fText(NULL),
      fNmbStackDeep(NULL),
      fNmbSortDeep(NULL)
{
   // TMemStatViewerGUI constructor; fileName specifies the ROOT tree used for drawing

   SetCleanup(kDeepCleanup);

   // ************************* content of this MainFrame *************************
   // top level container with horizontal layout
   // container for all GUI elements, vertical divided
   TGCompositeFrame *contMain = new TGCompositeFrame(this, w, h, kVerticalFrame | kFixedWidth | kFixedHeight);
   AddFrame(contMain, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));

   // container for all GUI elements, horizontal divided
   TGCompositeFrame *contLCR = new TGCompositeFrame(contMain, w, h, kHorizontalFrame | kFixedWidth | kFixedHeight);
   contMain->AddFrame(contLCR, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));

   // ************************* content of ContLCR *************************
   // container for GUI elements on left side
   TGCompositeFrame *contLeft = new TGCompositeFrame(contLCR, 160, 200, kVerticalFrame | kFixedWidth | kFitHeight);
   contLCR->AddFrame(contLeft, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandY, 5, 3, 3, 3));

   // left vertical splitter
   TGVSplitter *splitLeft = new TGVSplitter(contLCR);
   splitLeft->SetFrame(contLeft, kTRUE);
   contLCR->AddFrame(splitLeft, new TGLayoutHints(kLHintsLeft | kLHintsExpandY));

   // container for GUI elements at the center
   TGCompositeFrame *contCenter = new TGCompositeFrame(contLCR, 150, 200, kVerticalFrame | kFixedWidth | kFitHeight);
   contLCR->AddFrame(contCenter, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));

   TGTab *tab = new TGTab(contCenter, 150, 200);
   contCenter->AddFrame(tab, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
   TGCompositeFrame *text = tab->AddTab("Text");
   TGCompositeFrame *graphics = tab->AddTab("Graphics");

   fText = new TGTextView(text);
   text->AddFrame(fText, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));

   // Display everything
   Initialize(option);

   // Graphics View
   // TMemStat must be initialized first
   new TMemStatDrawDlg(graphics, fViewer);

   MakeStampList(contLeft);
   MakeSelection(contLeft);
   MakeContSortStat(contLeft);   // Make content for Sort Statistic
   MakeContSortStamp(contLeft);  // make content for sort Stamps
   MakeContDeep(contLeft);       // make content for sort Stamps

   MapSubwindows();
   Resize(GetDefaultSize());
   MapWindow();

   // Default View
   fViewer->SetSortStat( TMemStat::kTotalAllocCount );
   fViewer->SetSortStamp( TMemStat::kCurrent );
   MakePrint();
}

//______________________________________________________________________________
TMemStatViewerGUI::~TMemStatViewerGUI()
{
   // a dtor

   Cleanup();
   if (fViewer)
      fViewer->Delete();
}

//______________________________________________________________________________
void TMemStatViewerGUI::Initialize(Option_t* option)
{
   // initializes the GUI with default settings and opens tree for drawing

   delete fViewer;
   fViewer = new TMemStat(option);
   fViewer->Report();
}

//______________________________________________________________________________
void TMemStatViewerGUI::MakeContSortStat(TGCompositeFrame *frame)
{
   // make windows for Sorting *STAT* selection

   // sorting statistic option
   TGVButtonGroup *sortStatGroup = new TGVButtonGroup(frame, "Statistic type");
   frame->AddFrame(sortStatGroup, new TGLayoutHints(kLHintsExpandX));
   new TGRadioButton(sortStatGroup, "Total Alloc Count", rbtnTotalAllocCount);
   new TGRadioButton(sortStatGroup, "Total Alloc Size", rbtnTotalAllocSize);
   new TGRadioButton(sortStatGroup, "Alloc Count", rbtnAllocCount);
   new TGRadioButton(sortStatGroup, "Alloc Size", rbtnAllocSize);
   sortStatGroup->SetButton(rbtnTotalAllocCount);
   sortStatGroup->Connect("Pressed(Int_t)", "TMemStatViewerGUI", this, "HandleButtonsSortStat(Int_t)");
}

//______________________________________________________________________________
void TMemStatViewerGUI::MakeContSortStamp(TGCompositeFrame *frame)
{
   // make windows for Sorting *STAMP* selection

   // sorting stamp option
   TGVButtonGroup *sortStampGroup = new TGVButtonGroup(frame, "Sorting stamp");
   frame->AddFrame(sortStampGroup, new TGLayoutHints(kLHintsExpandX));
   new TGRadioButton(sortStampGroup, "Current", rbtnCurrent);
   new TGRadioButton(sortStampGroup, "Max Size", rbtnMaxSize);
   new TGRadioButton(sortStampGroup, "Max Count", rbtnMaxCount);
   sortStampGroup->SetButton(rbtnCurrent);
   sortStampGroup->Connect("Pressed(Int_t)", "TMemStatViewerGUI", this, "HandleButtonsSortStamp(Int_t)");
}

//______________________________________________________________________________
void TMemStatViewerGUI::MakeStampList(TGCompositeFrame *frame)
{
   // make STAMPs list box

   if (!fViewer)
      return;

   const TObjArray *stampList = fViewer->GetStampList();
   if (!stampList)
      return;

   TGHorizontalFrame *horz = new TGHorizontalFrame(frame);
   frame->AddFrame(horz, new TGLayoutHints(kLHintsExpandX, 2, 2, 10, 2));
   // text description
   TGLabel *lblName = new TGLabel(horz, "Stamp name:");
   horz->AddFrame(lblName,
                  new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 2, 2));

   // a list box of stamps
   TGComboBox *stampListBox = new TGComboBox(horz, lstStamps);
   stampListBox->Resize(100, 20);
   horz->AddFrame(stampListBox, new TGLayoutHints(kLHintsExpandX));
   stampListBox->Connect("Selected(const char*)", "TMemStatViewerGUI", this, "HandleStampSelect(const char*)");

   // filling Combo box of stamps
   TIter iter(stampList);
   for_each(iter.Begin(), TIter::End(),
            bind2nd(SFillListBox_t(), stampListBox));

   const Int_t count(stampListBox->GetNumberOfEntries());
   if (count <= 0)
      return;
   // Selecting the last stamp
   stampListBox->Select(count - 1);

   TObjString *str(dynamic_cast<TObjString*>(stampList->At(stampListBox->GetSelected())));
   if (!str)
      return;

   fViewer->SetCurrentStamp(*str);
}

//______________________________________________________________________________
void TMemStatViewerGUI::HandleStampSelect(const char* value)
{
   // TODO: Comment me

   fViewer->SetCurrentStamp(value);
   MakePrint();
}

//______________________________________________________________________________
void  TMemStatViewerGUI::MakeContDeep(TGCompositeFrame *frame)
{
   // create and layout "Deep" controls

   TGGroupFrame *contDeep = new TGGroupFrame(frame, "Deepnes");
   contDeep->SetLayoutManager(new TGMatrixLayout(contDeep, 0, 2, 5));
   frame->AddFrame(contDeep, new TGLayoutHints(kLHintsExpandX));

   // ------ Stack Deep
   // text description
   TGLabel *lblStackDeep = new TGLabel(contDeep, "Stack Deep:");
   contDeep->AddFrame(lblStackDeep, 0);
   // number entry box for specifying the stack deepness
   fNmbStackDeep = new TGNumberEntry(contDeep, fViewer->GetStackDeep(), 1, -1, TGNumberFormat::kNESInteger,
                                     TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 1, 50);
   contDeep->AddFrame(fNmbStackDeep, 0);
   fNmbStackDeep->Connect("ValueSet(Long_t)", "TMemStatViewerGUI", this, "HandleDeep(Long_t)");
   fNmbStackDeep->Resize(60, 20);

   // ------ Sort Deep
   // text description
   TGLabel *lSortDeep = new TGLabel(contDeep, "Sort Deep:");
   contDeep->AddFrame(lSortDeep, 0);
   // number entry box for specifying the number of stamps
   fNmbSortDeep = new TGNumberEntry(contDeep, fViewer->GetSortDeep(), 1, -1, TGNumberFormat::kNESInteger,
                                    TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 1, 50);
   contDeep->AddFrame(fNmbSortDeep, 0);
   fNmbSortDeep->Connect("ValueSet(Long_t)", "TMemStatViewerGUI", this, "HandleDeep(Long_t)");
   fNmbSortDeep->Resize(60, 20);
}

//______________________________________________________________________________
void TMemStatViewerGUI::HandleButtonsSortStat(Int_t id)
{
   // handles mutual radio button exclusions - set sort stat type
   TMemStat::StatType val;
   HandleRButtons(id, rbtnTotalAllocCount, &val);
   fViewer->SetSortStat(val);
   MakePrint();
}

//___________________________l___________________________________________________
void TMemStatViewerGUI::HandleButtonsSortStamp(Int_t id)
{
   // handles mutual radio button exclusions - set sort stat type
   TMemStat::StampType val;
   HandleRButtons(id, rbtnCurrent, &val);
   fViewer->SetSortStamp(val);
   MakePrint();
}

//______________________________________________________________________________
void TMemStatViewerGUI::HandleDeep(Long_t /*id*/)
{
   // handles stack deep

   fViewer->SetStackDeep( fNmbStackDeep->GetIntNumber() );
   fViewer->SetSortDeep( fNmbSortDeep->GetIntNumber() );
   MakePrint();
}

//______________________________________________________________________________
void TMemStatViewerGUI::ShowGUI()
{
   // initialize and show GUI for presentation

   TGMainFrame* frmMain = new TGMainFrame(gClient->GetRoot(), 950, 600);
   frmMain->SetWindowName("TMemStat analysis console");
   frmMain->SetCleanup(kDeepCleanup);

   TMemStatViewerGUI* calibViewer1 = new TMemStatViewerGUI(frmMain, 950, 600, "read");
   frmMain->AddFrame(calibViewer1, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));

   // position relative to the parent's window
   //frmMain->CenterOnParent();
   frmMain->MapSubwindows();
   frmMain->Resize();
   frmMain->MapWindow();
}

//______________________________________________________________________________
void TMemStatViewerGUI::MakePrint()
{
   // make report and load it to the view
   fViewer->MakeReport( fCurLib.c_str(), fCurFunc.c_str(), 0, "/tmp/memstatprint.txt");
   fText->LoadFile("/tmp/memstatprint.txt");
}

//______________________________________________________________________________
void TMemStatViewerGUI::MakeSelection(TGCompositeFrame *frame)
{
   // TODO: Comment me
   if (!fViewer)
      return;

   TGGroupFrame *grp = new TGGroupFrame(frame, "Selections");
   frame->AddFrame(grp, new TGLayoutHints(kLHintsExpandX));

   // ----- Function
   // text description
   TGLabel *lblFun = new TGLabel(grp, "Function");
   grp->AddFrame(lblFun, new TGLayoutHints(kLHintsExpandX ));
   // a list box of stamps
   TGComboBox *lboxFunctions = new TGComboBox(grp);
   lboxFunctions->Resize(100, 20);
   grp->AddFrame(lboxFunctions, new TGLayoutHints(kLHintsExpandX ));
   lboxFunctions->Connect("Selected(const char*)", "TMemStatViewerGUI", this, "HandleFuncSelect(const char*)");

   // Add default selection - select all
   lboxFunctions->AddEntry("*", 0);
   // Fill values for Functions
   TMemStat::Selection_t container;
   fViewer->GetFillSelection( &container, TMemStat::kFunction );
   for_each(container.begin(), container.end(),
            bind2nd(SStringToListBox_t(), lboxFunctions));
   lboxFunctions->Select(0);

   // ----- Library
   // text description
   TGLabel *lblLib = new TGLabel(grp, "Libraries");
   grp->AddFrame(lblLib, new TGLayoutHints(kLHintsExpandX));
   // a list box of stamps
   TGComboBox *lboxLibraries = new TGComboBox(grp);
   lboxLibraries->Resize(100, 20);
   grp->AddFrame(lboxLibraries, new TGLayoutHints(kLHintsExpandX ));
   lboxLibraries->Connect("Selected(const char*)", "TMemStatViewerGUI", this, "HandleLibSelect(const char*)");

   // Add default selection - select all
   lboxLibraries->AddEntry("*", 0);
   // Fill values for Functions
   container.clear();
   fViewer->GetFillSelection( &container, TMemStat::kLibrary );
   for_each(container.begin(), container.end(),
            bind2nd(SStringToListBox_t(), lboxLibraries));
   lboxLibraries->Select(0);
}

//______________________________________________________________________________
void TMemStatViewerGUI::HandleFuncSelect(const char* _val)
{
   // TODO: Comment me
   fCurFunc = _val;
   // if _val == "*" then we don't sort
   if ( fCurFunc.find("*") != string::npos )
      fCurFunc.clear();

   MakePrint();
}

//______________________________________________________________________________
void TMemStatViewerGUI::HandleLibSelect(const char* _val)
{
   // TODO: Comment me
   fCurLib = _val;
   // if _val == "*" then we don't sort
   if ( fCurLib.find("*") != string::npos )
      fCurLib.clear();

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