ROOT logo
// @(#)root/memstat:$Name$:$Id: TMemStatDrawDlg.cxx 24658 2008-07-04 09:06:58Z anar $
// Author: Anar Manafov (A.Manafov@gsi.de) 31/05/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.             *
 *************************************************************************/

// STD
#include <sstream>
#include <algorithm>
// ROOT
#include "TGLabel.h"
#include "TGComboBox.h"
#include "TGNumberEntry.h"
#include "TGButton.h"
#include "TCanvas.h"
#include "TRootEmbeddedCanvas.h"
// MemStat
#include "TMemStat.h"
#include "TMemStatDrawDlg.h"
#include "TMemStatResource.h"

using namespace std;

//______________________________________________________________________________
struct SFill_t : public binary_function<string, TGComboBox*, bool>
{
   bool operator()(const string &val, TGComboBox* box) const
   {
      if (!box)
         return false;//Parameter is a NULL pointer"

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

//______________________________________________________________________________
TMemStatDrawDlg::TMemStatDrawDlg(TGCompositeFrame *parent, TMemStat *MemStat):
      fMemStat(MemStat),
      fboxOrder(NULL),
      fboxSortStat(NULL),
      fboxSortStamp(NULL),
      fNmbStackDeep(NULL),
      fNmbSortDeep(NULL),
      fNmbMaxLength(NULL),
      fEc(NULL)
{
  // a ctor
   PlaceCtrls(parent);
}

//______________________________________________________________________________
TMemStatDrawDlg::~TMemStatDrawDlg()
{
  // a dtor
}

//______________________________________________________________________________
void TMemStatDrawDlg::PlaceCtrls(TGCompositeFrame *frame)
{
   // TODO: Comment me

   TGCompositeFrame *cont = new TGCompositeFrame(frame, 800, 400, kHorizontalFrame | kFitWidth | kFitHeight);
   frame->AddFrame(cont, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandY | kLHintsExpandX, 2, 2, 2, 2));

   TGCompositeFrame *contR = new TGCompositeFrame(cont, 200, 200, kVerticalFrame | kFitWidth | kFitHeight);
   cont->AddFrame(contR, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandY, 2, 2, 2, 2));

   StringVector_t values;
   // Order
   values.push_back("increasing");
   values.push_back("decreasing");
   PlaceLBoxCtrl(contR, &fboxOrder, "Order: ", values, resCBoxOrder);
   // Sort Stat
   values.clear();
   values.push_back("TotalAllocCount");
   values.push_back("TotalAlocSize");
   values.push_back("AllocCount");
   values.push_back("AllocSize");
   PlaceLBoxCtrl(contR, &fboxSortStat, "Sort stat: ", values, resCBoxSortStat);
   // Sort Stamp
   values.clear();
   values.push_back("Current");
   values.push_back("MaxSize");
   values.push_back("MaxCount");
   PlaceLBoxCtrl(contR, &fboxSortStamp, "Sort stamp: ", values, resCBoxSortStamp);
   // sortdeep and stackdeep
   PlaceDeepCtrl(contR);

   // a Draw button
   TGTextButton *btnDraw = new TGTextButton(contR);
   btnDraw->Connect("Clicked()", "TMemStatDrawDlg", this, "HandleDrawMemStat()");
   btnDraw->SetText("Draw");
   contR->AddFrame(btnDraw,
                   new TGLayoutHints(kLHintsCenterX | kLHintsExpandX, 10, 10, 10, 10));

   // a Canvas
   PlaceEmbeddedCanvas(cont);
}

//______________________________________________________________________________
void TMemStatDrawDlg::PlaceLBoxCtrl(TGCompositeFrame *frame, TGComboBox **box,
                                    const string &Label, const StringVector_t &Vealues, Int_t resource)
{
   // TODO: Comment me

   TGHorizontalFrame *horz = new TGHorizontalFrame(frame);
   frame->AddFrame(horz, new TGLayoutHints(kLHintsExpandX));
   // text description
   TGLabel *lbl = new TGLabel(horz, Label.c_str());
   horz->AddFrame(lbl,
                  new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 2, 2));

   // a list box of stamps
   *box = new TGComboBox( horz, resource );
   (*box)->Resize(120, 20);
   horz->AddFrame((*box), new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));

   // filling Combo box with values
   for_each(Vealues.begin(), Vealues.end(), bind2nd(SFill_t(), (*box)));

   (*box)->Select(0);
}

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

   // deep of information
   TGGroupFrame *contDeep = new TGGroupFrame(frame, "Deepnes", kVerticalFrame | kFitWidth | kFitHeight);
   frame->AddFrame(contDeep, new TGLayoutHints(kLHintsExpandX));

   // A "Deep" frame
   TGHorizontalFrame *horz0 = new TGHorizontalFrame(contDeep);
   contDeep->AddFrame(horz0, new TGLayoutHints(kLHintsExpandX | kLHintsCenterY));
   // ------ Stack Deep
   // text description
   TGLabel *lblStackDeep = new TGLabel(horz0, "Stack deep:");
   horz0->AddFrame(lblStackDeep, new TGLayoutHints(kLHintsLeft | kLHintsCenterY));
   // number entry box for specifying the stack deepness
   fNmbStackDeep = new TGNumberEntry(horz0, fMemStat->GetStackDeep(), 1, resNmbStackDeep, TGNumberFormat::kNESInteger,
                                     TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 1, 50);
   horz0->AddFrame(fNmbStackDeep, new TGLayoutHints( kLHintsRight, 2, 2, 2, 2));
   fNmbStackDeep->Resize(100, 20);

   // ------ Sort Deep
   TGHorizontalFrame *horz1 = new TGHorizontalFrame(contDeep);
   contDeep->AddFrame(horz1, new TGLayoutHints(kLHintsExpandX | kLHintsCenterY));
   // text description
   TGLabel *lSortDeep = new TGLabel(horz1, "Sort deep:");
   horz1->AddFrame(lSortDeep, new TGLayoutHints(kLHintsLeft | kLHintsCenterY));
   // number entry box for specifying the number of stamps
   fNmbSortDeep = new TGNumberEntry(horz1, fMemStat->GetSortDeep(), 1, resNmbSortDeep, TGNumberFormat::kNESInteger,
                                    TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 1, 50);
   horz1->AddFrame(fNmbSortDeep, new TGLayoutHints( kLHintsRight, 2, 2, 2, 2));
   fNmbSortDeep->Resize(100, 20);

   // ------ Max length
   TGHorizontalFrame *horz2 = new TGHorizontalFrame(contDeep);
   contDeep->AddFrame(horz2, new TGLayoutHints(kLHintsExpandX | kLHintsCenterY));
   // text description
   TGLabel *lbl = new TGLabel(horz2, "Max length:");
   horz2->AddFrame(lbl, new TGLayoutHints(kLHintsLeft | kLHintsCenterY));
   // number entry box for specifying the number of stamps
   fNmbMaxLength = new TGNumberEntry(horz2, fMemStat->GetMaxStringLength(), 1, resNmbMaxLength, TGNumberFormat::kNESInteger,
                                     TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 1, 500);
   horz2->AddFrame(fNmbMaxLength, new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
   fNmbMaxLength->Resize(100, 20);
}

//______________________________________________________________________________
void TMemStatDrawDlg::ReDraw()
{
   // TODO: Comment me

   if (!fMemStat)
      return;

   //"order 0 sortstat 2 sortstamp 1 sortdeep 10 stackdeep 5 maxlength 50"
   ostringstream ss;
   // order
   if (fboxOrder)
      ss << "order " << fboxOrder->GetSelected();
   // sort stat
   if (fboxSortStat)
      ss << " sortstat " << fboxSortStat->GetSelected();
   // sort stamp
   if (fboxSortStamp)
      ss << " sortstamp " << fboxSortStamp->GetSelected();
   // sort deep
   if (fNmbStackDeep)
      ss << " sortdeep " << fNmbStackDeep->GetIntNumber();
   // stack deep
   if (fNmbSortDeep)
      ss << " stackdeep " << fNmbSortDeep->GetIntNumber();
   // max length
   if (fNmbMaxLength)
      ss << " maxlength " << fNmbMaxLength->GetIntNumber();

   fMemStat->Draw(ss.str().c_str());
   fEc->GetCanvas()->Modified();
   fEc->GetCanvas()->Update();
}

//______________________________________________________________________________
void TMemStatDrawDlg::HandleDrawMemStat()
{
   // TODO: Comment me
   ReDraw();
}

//______________________________________________________________________________
void TMemStatDrawDlg::PlaceEmbeddedCanvas(TGCompositeFrame *frame)
{
   // TODO: Comment me
   if (fEc)
      return;

   fEc = new TRootEmbeddedCanvas("ec", frame, 200, 200);
   frame->AddFrame(fEc, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
   fEc->GetCanvas()->SetBorderMode(0);
}
 TMemStatDrawDlg.cxx:1
 TMemStatDrawDlg.cxx:2
 TMemStatDrawDlg.cxx:3
 TMemStatDrawDlg.cxx:4
 TMemStatDrawDlg.cxx:5
 TMemStatDrawDlg.cxx:6
 TMemStatDrawDlg.cxx:7
 TMemStatDrawDlg.cxx:8
 TMemStatDrawDlg.cxx:9
 TMemStatDrawDlg.cxx:10
 TMemStatDrawDlg.cxx:11
 TMemStatDrawDlg.cxx:12
 TMemStatDrawDlg.cxx:13
 TMemStatDrawDlg.cxx:14
 TMemStatDrawDlg.cxx:15
 TMemStatDrawDlg.cxx:16
 TMemStatDrawDlg.cxx:17
 TMemStatDrawDlg.cxx:18
 TMemStatDrawDlg.cxx:19
 TMemStatDrawDlg.cxx:20
 TMemStatDrawDlg.cxx:21
 TMemStatDrawDlg.cxx:22
 TMemStatDrawDlg.cxx:23
 TMemStatDrawDlg.cxx:24
 TMemStatDrawDlg.cxx:25
 TMemStatDrawDlg.cxx:26
 TMemStatDrawDlg.cxx:27
 TMemStatDrawDlg.cxx:28
 TMemStatDrawDlg.cxx:29
 TMemStatDrawDlg.cxx:30
 TMemStatDrawDlg.cxx:31
 TMemStatDrawDlg.cxx:32
 TMemStatDrawDlg.cxx:33
 TMemStatDrawDlg.cxx:34
 TMemStatDrawDlg.cxx:35
 TMemStatDrawDlg.cxx:36
 TMemStatDrawDlg.cxx:37
 TMemStatDrawDlg.cxx:38
 TMemStatDrawDlg.cxx:39
 TMemStatDrawDlg.cxx:40
 TMemStatDrawDlg.cxx:41
 TMemStatDrawDlg.cxx:42
 TMemStatDrawDlg.cxx:43
 TMemStatDrawDlg.cxx:44
 TMemStatDrawDlg.cxx:45
 TMemStatDrawDlg.cxx:46
 TMemStatDrawDlg.cxx:47
 TMemStatDrawDlg.cxx:48
 TMemStatDrawDlg.cxx:49
 TMemStatDrawDlg.cxx:50
 TMemStatDrawDlg.cxx:51
 TMemStatDrawDlg.cxx:52
 TMemStatDrawDlg.cxx:53
 TMemStatDrawDlg.cxx:54
 TMemStatDrawDlg.cxx:55
 TMemStatDrawDlg.cxx:56
 TMemStatDrawDlg.cxx:57
 TMemStatDrawDlg.cxx:58
 TMemStatDrawDlg.cxx:59
 TMemStatDrawDlg.cxx:60
 TMemStatDrawDlg.cxx:61
 TMemStatDrawDlg.cxx:62
 TMemStatDrawDlg.cxx:63
 TMemStatDrawDlg.cxx:64
 TMemStatDrawDlg.cxx:65
 TMemStatDrawDlg.cxx:66
 TMemStatDrawDlg.cxx:67
 TMemStatDrawDlg.cxx:68
 TMemStatDrawDlg.cxx:69
 TMemStatDrawDlg.cxx:70
 TMemStatDrawDlg.cxx:71
 TMemStatDrawDlg.cxx:72
 TMemStatDrawDlg.cxx:73
 TMemStatDrawDlg.cxx:74
 TMemStatDrawDlg.cxx:75
 TMemStatDrawDlg.cxx:76
 TMemStatDrawDlg.cxx:77
 TMemStatDrawDlg.cxx:78
 TMemStatDrawDlg.cxx:79
 TMemStatDrawDlg.cxx:80
 TMemStatDrawDlg.cxx:81
 TMemStatDrawDlg.cxx:82
 TMemStatDrawDlg.cxx:83
 TMemStatDrawDlg.cxx:84
 TMemStatDrawDlg.cxx:85
 TMemStatDrawDlg.cxx:86
 TMemStatDrawDlg.cxx:87
 TMemStatDrawDlg.cxx:88
 TMemStatDrawDlg.cxx:89
 TMemStatDrawDlg.cxx:90
 TMemStatDrawDlg.cxx:91
 TMemStatDrawDlg.cxx:92
 TMemStatDrawDlg.cxx:93
 TMemStatDrawDlg.cxx:94
 TMemStatDrawDlg.cxx:95
 TMemStatDrawDlg.cxx:96
 TMemStatDrawDlg.cxx:97
 TMemStatDrawDlg.cxx:98
 TMemStatDrawDlg.cxx:99
 TMemStatDrawDlg.cxx:100
 TMemStatDrawDlg.cxx:101
 TMemStatDrawDlg.cxx:102
 TMemStatDrawDlg.cxx:103
 TMemStatDrawDlg.cxx:104
 TMemStatDrawDlg.cxx:105
 TMemStatDrawDlg.cxx:106
 TMemStatDrawDlg.cxx:107
 TMemStatDrawDlg.cxx:108
 TMemStatDrawDlg.cxx:109
 TMemStatDrawDlg.cxx:110
 TMemStatDrawDlg.cxx:111
 TMemStatDrawDlg.cxx:112
 TMemStatDrawDlg.cxx:113
 TMemStatDrawDlg.cxx:114
 TMemStatDrawDlg.cxx:115
 TMemStatDrawDlg.cxx:116
 TMemStatDrawDlg.cxx:117
 TMemStatDrawDlg.cxx:118
 TMemStatDrawDlg.cxx:119
 TMemStatDrawDlg.cxx:120
 TMemStatDrawDlg.cxx:121
 TMemStatDrawDlg.cxx:122
 TMemStatDrawDlg.cxx:123
 TMemStatDrawDlg.cxx:124
 TMemStatDrawDlg.cxx:125
 TMemStatDrawDlg.cxx:126
 TMemStatDrawDlg.cxx:127
 TMemStatDrawDlg.cxx:128
 TMemStatDrawDlg.cxx:129
 TMemStatDrawDlg.cxx:130
 TMemStatDrawDlg.cxx:131
 TMemStatDrawDlg.cxx:132
 TMemStatDrawDlg.cxx:133
 TMemStatDrawDlg.cxx:134
 TMemStatDrawDlg.cxx:135
 TMemStatDrawDlg.cxx:136
 TMemStatDrawDlg.cxx:137
 TMemStatDrawDlg.cxx:138
 TMemStatDrawDlg.cxx:139
 TMemStatDrawDlg.cxx:140
 TMemStatDrawDlg.cxx:141
 TMemStatDrawDlg.cxx:142
 TMemStatDrawDlg.cxx:143
 TMemStatDrawDlg.cxx:144
 TMemStatDrawDlg.cxx:145
 TMemStatDrawDlg.cxx:146
 TMemStatDrawDlg.cxx:147
 TMemStatDrawDlg.cxx:148
 TMemStatDrawDlg.cxx:149
 TMemStatDrawDlg.cxx:150
 TMemStatDrawDlg.cxx:151
 TMemStatDrawDlg.cxx:152
 TMemStatDrawDlg.cxx:153
 TMemStatDrawDlg.cxx:154
 TMemStatDrawDlg.cxx:155
 TMemStatDrawDlg.cxx:156
 TMemStatDrawDlg.cxx:157
 TMemStatDrawDlg.cxx:158
 TMemStatDrawDlg.cxx:159
 TMemStatDrawDlg.cxx:160
 TMemStatDrawDlg.cxx:161
 TMemStatDrawDlg.cxx:162
 TMemStatDrawDlg.cxx:163
 TMemStatDrawDlg.cxx:164
 TMemStatDrawDlg.cxx:165
 TMemStatDrawDlg.cxx:166
 TMemStatDrawDlg.cxx:167
 TMemStatDrawDlg.cxx:168
 TMemStatDrawDlg.cxx:169
 TMemStatDrawDlg.cxx:170
 TMemStatDrawDlg.cxx:171
 TMemStatDrawDlg.cxx:172
 TMemStatDrawDlg.cxx:173
 TMemStatDrawDlg.cxx:174
 TMemStatDrawDlg.cxx:175
 TMemStatDrawDlg.cxx:176
 TMemStatDrawDlg.cxx:177
 TMemStatDrawDlg.cxx:178
 TMemStatDrawDlg.cxx:179
 TMemStatDrawDlg.cxx:180
 TMemStatDrawDlg.cxx:181
 TMemStatDrawDlg.cxx:182
 TMemStatDrawDlg.cxx:183
 TMemStatDrawDlg.cxx:184
 TMemStatDrawDlg.cxx:185
 TMemStatDrawDlg.cxx:186
 TMemStatDrawDlg.cxx:187
 TMemStatDrawDlg.cxx:188
 TMemStatDrawDlg.cxx:189
 TMemStatDrawDlg.cxx:190
 TMemStatDrawDlg.cxx:191
 TMemStatDrawDlg.cxx:192
 TMemStatDrawDlg.cxx:193
 TMemStatDrawDlg.cxx:194
 TMemStatDrawDlg.cxx:195
 TMemStatDrawDlg.cxx:196
 TMemStatDrawDlg.cxx:197
 TMemStatDrawDlg.cxx:198
 TMemStatDrawDlg.cxx:199
 TMemStatDrawDlg.cxx:200
 TMemStatDrawDlg.cxx:201
 TMemStatDrawDlg.cxx:202
 TMemStatDrawDlg.cxx:203
 TMemStatDrawDlg.cxx:204
 TMemStatDrawDlg.cxx:205
 TMemStatDrawDlg.cxx:206
 TMemStatDrawDlg.cxx:207
 TMemStatDrawDlg.cxx:208
 TMemStatDrawDlg.cxx:209
 TMemStatDrawDlg.cxx:210
 TMemStatDrawDlg.cxx:211
 TMemStatDrawDlg.cxx:212
 TMemStatDrawDlg.cxx:213
 TMemStatDrawDlg.cxx:214
 TMemStatDrawDlg.cxx:215
 TMemStatDrawDlg.cxx:216
 TMemStatDrawDlg.cxx:217
 TMemStatDrawDlg.cxx:218
 TMemStatDrawDlg.cxx:219
 TMemStatDrawDlg.cxx:220
 TMemStatDrawDlg.cxx:221
 TMemStatDrawDlg.cxx:222
 TMemStatDrawDlg.cxx:223
 TMemStatDrawDlg.cxx:224
 TMemStatDrawDlg.cxx:225
 TMemStatDrawDlg.cxx:226
 TMemStatDrawDlg.cxx:227
 TMemStatDrawDlg.cxx:228