40
42
int CBProfilerExecDlg::Execute(wxString exename, wxString dataname, struct_config config)
42
//this->parent = parent;
44
44
// gprof optional parameters
45
45
wxString param = config.txtExtra;
46
if (config.chkAnnSource) param << _T(" -A") << config.txtAnnSource;
47
if (config.chkMinCount) param << _T(" -m ") << config.spnMinCount;
48
if (config.chkBrief) param << _T(" -b");
49
if (config.chkFileInfo) param << _T(" -i");
50
if (config.chkNoStatic) param << _T(" -a");
51
if (config.chkSum) param << _T(" -s");
46
if (config.chkAnnSource && !config.txtAnnSource.IsEmpty()) param << _T(" -A") << config.txtAnnSource;
47
if (config.chkMinCount) param << _T(" -m ") << config.spnMinCount;
48
if (config.chkBrief) param << _T(" -b");
49
if (config.chkFileInfo) param << _T(" -i");
50
if (config.chkUnusedFunctions) param << _T(" -z");
51
if (config.chkStaticCallGraph) param << _T(" -c");
52
if (config.chkNoStatic) param << _T(" -a");
53
if (config.chkSum) param << _T(" -s");
54
56
cmd << _T("gprof ") << param << _T(" \"") << exename << _T("\" \"") << dataname << _T("\"");
56
wxProgressDialog progress(_("C::B Profiler plugin"),_("Launching gprof. Please wait..."));
57
int pid = wxExecute(cmd, gprof_output, gprof_errors);
60
{ // begin lifetime of wxBusyInfo
61
wxBusyInfo wait(_("Please wait, while running gprof..."), this);
62
Manager::Get()->GetLogManager()->DebugLog(F(_T("Profiler: Running command %s"), cmd.c_str()));
63
pid = wxExecute(cmd, gprof_output, gprof_errors);
64
} // end lifetime of wxBusyInfo
62
wxString msg = _("Unable to execute Gprof\nBe sure it is in the OS global path\nC::B Profiler could not complete the operation");
68
wxString msg = _("Unable to execute gprof.\nBe sure the gprof executable is in the OS global path.\nC::B Profiler could not complete the operation.");
63
69
cbMessageBox(msg, _("Error"), wxICON_ERROR | wxOK, (wxWindow*)Manager::Get()->GetAppWindow());
64
70
Manager::Get()->GetLogManager()->DebugLog(msg);
70
wxXmlResource::Get()->LoadDialog(this, parent, _T("dlgCBProfilerExec"));
76
wxXmlResource::Get()->LoadObject(this, parent, _T("dlgCBProfilerExec"),_T("wxScrollingDialog"));
71
77
wxFont font(10, wxMODERN, wxNORMAL, wxNORMAL);
72
outputFlatProfileArea=XRCCTRL(*this, "lstFlatProfile", wxListCtrl);
73
outputHelpFlatProfileArea=XRCCTRL(*this, "txtHelpFlatProfile", wxTextCtrl);
78
outputFlatProfileArea = XRCCTRL(*this, "lstFlatProfile", wxListCtrl);
79
outputHelpFlatProfileArea = XRCCTRL(*this, "txtHelpFlatProfile", wxTextCtrl);
74
80
outputHelpFlatProfileArea->SetFont(font);
75
outputCallGraphArea=XRCCTRL(*this, "lstCallGraph", wxListCtrl);
76
outputHelpCallGraphArea=XRCCTRL(*this, "txtHelpCallGraph", wxTextCtrl);
81
outputCallGraphArea = XRCCTRL(*this, "lstCallGraph", wxListCtrl);
82
outputHelpCallGraphArea = XRCCTRL(*this, "txtHelpCallGraph", wxTextCtrl);
77
83
outputHelpCallGraphArea->SetFont(font);
78
outputMiscArea=XRCCTRL(*this, "txtMisc", wxTextCtrl);
84
outputMiscArea = XRCCTRL(*this, "txtMisc", wxTextCtrl);
79
85
outputMiscArea->SetFont(font);
81
87
if(!gprof_output.IsEmpty())
90
void CBProfilerExecDlg::ShowOutput(wxArrayString msg, bool error)
96
void CBProfilerExecDlg::ShowOutput(const wxArrayString& msg, bool error)
93
size_t count = msg.GetCount();
98
const size_t maxcount(msg.GetCount());
99
wxProgressDialog progress(_("C::B Profiler plugin"),_("Parsing profile information. Please wait..."));
104
wxProgressDialog progress(_("C::B Profiler plugin"),_("Parsing profile information. Please wait..."), maxcount, NULL, wxPD_AUTO_HIDE|wxPD_APP_MODAL|wxPD_SMOOTH);
100
106
// Parsing Flat Profile
102
if (msg[n].Find(_T("Flat profile")) != -1)
103
n = ParseFlatProfile(msg, n, progress);
108
if (msg[count].Find(_T("Flat profile")) != -1)
109
ParseFlatProfile(msg, progress, maxcount, count);
105
111
// Parsing Call Graph
106
if (msg[n].Find(_T("Call graph")) != -1)
107
n = ParseCallGraph(msg, ++n, progress);
112
if (msg[count].Find(_T("Call graph")) != -1)
113
ParseCallGraph(msg, progress, maxcount, count);
109
115
// The rest of the lines, if any, is printed in the Misc tab
110
progress.Update((100*n)/(count-1),_("Parsing profile information. Please wait..."));
111
for ( ; n < count; ++n )
113
output << msg[n] << _T("\n");
114
progress.Update((100*n)/(count-1));
116
outputMiscArea->SetValue(output);
117
progress.Update(100);
116
ParseMisc(msg, progress, maxcount, count);
121
for (size_t n = 0; n < count; ++n )
121
for (size_t count(0); count < maxcount; ++count )
123
output << msg[n] << _T("\n");
123
output << msg[count] << _T("\n");
125
125
outputMiscArea->SetValue(output);
126
wxColour colour(255,0,0);
126
const wxColour colour(255,0,0);
127
127
outputMiscArea->SetForegroundColour(colour);
128
XRCCTRL(*this, "tabs", wxNotebook)->SetSelection(2);
137
137
void CBProfilerExecDlg::EndModal(int retCode)
139
wxDialog::EndModal(retCode);
142
size_t CBProfilerExecDlg::ParseCallGraph(wxArrayString msg, size_t begin, wxProgressDialog &progress)
139
wxScrollingDialog::EndModal(retCode);
142
// Sorting function of the flat profile columns
143
int wxCALLBACK SortFunction(long item1, long item2, long sortData)
145
CBProfilerExecDlg *dialog = (CBProfilerExecDlg*) sortData;
147
wxListCtrl *listCtrl = dialog->GetoutputFlatProfileArea();
148
int col = dialog->GetsortColumn();
149
long itemId1 = listCtrl->FindItem(-1, item1);
150
long itemId2 = listCtrl->FindItem(-1, item2);
152
wxListItem listItem1, listItem2;
154
listItem1.SetId(itemId1);
155
listItem1.SetColumn(col);
156
listItem1.SetMask(wxLIST_MASK_TEXT);
157
listCtrl->GetItem(listItem1);
159
listItem2.SetId(itemId2);
160
listItem2.SetColumn(col);
161
listItem2.SetMask(wxLIST_MASK_TEXT);
162
listCtrl->GetItem(listItem2);
164
// All the columns are composed with numbers except the last one
167
if (dialog->GetsortAscending())
168
return wxStrcmp(listItem1.GetText(), listItem2.GetText());
170
return wxStrcmp(listItem2.GetText(), listItem1.GetText());
175
double success = listItem1.GetText().ToDouble(&num1);
178
if (dialog->GetsortAscending()) return -1;
181
success = listItem2.GetText().ToDouble(&num2);
184
if (dialog->GetsortAscending()) return 1;
187
if (dialog->GetsortAscending())
189
if (num1 < num2) return -1;
190
else if (num1 > num2) return 1;
195
if (num1 > num2) return -1;
196
else if (num1 < num2) return 1;
202
// Function called when a column header is clicked
203
void CBProfilerExecDlg::OnColumnClick(wxListEvent& event)
205
if (event.GetColumn() != sortColumn)
206
sortAscending = true;
208
sortAscending = !sortAscending;
210
sortColumn = event.GetColumn();
211
outputFlatProfileArea->SortItems(SortFunction, (long)this);
214
void CBProfilerExecDlg::ParseMisc(const wxArrayString& msg, wxProgressDialog &progress, const size_t maxcount, size_t &count)
218
progress.Update(count, _("Parsing miscellaneous information. Please wait..."));
219
for ( ; count < maxcount; ++count )
221
if ((count%10) == 0) progress.Update(count);
222
output << msg[count] << _T("\n");
224
outputMiscArea->SetValue(output);
227
void CBProfilerExecDlg::ParseCallGraph(const wxArrayString& msg, wxProgressDialog &progress, const size_t maxcount, size_t& count)
148
229
// Setting colums names
149
outputCallGraphArea->InsertColumn(0, _T("index"), wxLIST_FORMAT_CENTRE);
150
outputCallGraphArea->InsertColumn(1, _T("% time"), wxLIST_FORMAT_CENTRE);
151
outputCallGraphArea->InsertColumn(2, _T("self"), wxLIST_FORMAT_CENTRE);
230
outputCallGraphArea->InsertColumn(0, _T("index"), wxLIST_FORMAT_CENTRE);
231
outputCallGraphArea->InsertColumn(1, _T("% time"), wxLIST_FORMAT_CENTRE);
232
outputCallGraphArea->InsertColumn(2, _T("self"), wxLIST_FORMAT_CENTRE);
152
233
outputCallGraphArea->InsertColumn(3, _T("children"), wxLIST_FORMAT_CENTRE);
153
outputCallGraphArea->InsertColumn(4, _T("called"), wxLIST_FORMAT_CENTRE);
234
outputCallGraphArea->InsertColumn(4, _T("called"), wxLIST_FORMAT_CENTRE);
154
235
outputCallGraphArea->InsertColumn(5, _T("name"));
156
237
// Jump header lines
157
while ((begin < msg.GetCount())&&(msg[begin].Find(_T("index % time")) == -1))
238
progress.Update(count,_("Parsing call graph information. Please wait..."));
239
while ( (count < maxcount) && (msg[count].Find(_T("index % time")) == -1) )
241
if ((count%10) == 0) progress.Update(count);
163
progress.Update((100*begin)/(msg.GetCount()-1),_("Parsing Call Graph information. Please wait..."));
165
246
// Parsing Call Graph
166
for (n = begin ; n < msg.GetCount(); ++n )
251
// setting listctrl default text colour for secondary lines
252
const wxColour COLOUR(wxTheColourDatabase->Find(_T("GREY")));
254
for ( ; count < maxcount; ++count )
168
if ((msg[n].IsEmpty())||(msg[n].Find(0x0C) != -1))
256
if ((count%10) == 0) progress.Update(count);
259
if ( (TOKEN.IsEmpty()) || (TOKEN.Find(wxChar(0x0C)) != -1) )
170
outputCallGraphArea->InsertItem(next,_T(""));
171
char first_char = msg[n].GetChar(0);
262
outputCallGraphArea->InsertItem(count,_T(""));
263
char first_char = TOKEN.GetChar(0);
264
// treating the empty separator lines
172
265
if (first_char == '-')
174
267
outputCallGraphArea->SetItem(next, 0, _T(""));
182
outputCallGraphArea->SetItem(next, 0, ((msg[n].Mid(0,6)).Trim(true)).Trim(false));
183
outputCallGraphArea->SetItem(next, 1, ((msg[n].Mid(6,6)).Trim(true)).Trim(false));
184
outputCallGraphArea->SetItem(next, 2, ((msg[n].Mid(12,8)).Trim(true)).Trim(false));
185
outputCallGraphArea->SetItem(next, 3, ((msg[n].Mid(20,8)).Trim(true)).Trim(false));
186
outputCallGraphArea->SetItem(next, 4, ((msg[n].Mid(28,17)).Trim(true)).Trim(false));
187
outputCallGraphArea->SetItem(next, 5, msg[n].Mid(45));
275
outputCallGraphArea->SetItem(next, 0, TOKEN(0,6).Trim(true).Trim(false));
276
outputCallGraphArea->SetItem(next, 1, TOKEN(6,6).Trim(true).Trim(false));
277
outputCallGraphArea->SetItem(next, 2, TOKEN(12,8).Trim(true).Trim(false));
278
outputCallGraphArea->SetItem(next, 3, TOKEN(20,8).Trim(true).Trim(false));
279
outputCallGraphArea->SetItem(next, 4, TOKEN(28,17).Trim(true).Trim(false));
280
outputCallGraphArea->SetItem(next, 5, TOKEN.Mid(45));
188
281
if (first_char != '[')
192
item.SetTextColour(wxTheColourDatabase->Find(_T("GREY")));
193
outputCallGraphArea->SetItem(item);
283
outputCallGraphArea->SetItemTextColour(next,COLOUR);
196
progress.Update((100*n)/(msg.GetCount()-1));
202
291
outputCallGraphArea->SetColumnWidth(1, wxLIST_AUTOSIZE_USEHEADER );
203
292
outputCallGraphArea->SetColumnWidth(2, wxLIST_AUTOSIZE_USEHEADER );
204
293
outputCallGraphArea->SetColumnWidth(3, wxLIST_AUTOSIZE_USEHEADER );
205
outputCallGraphArea->SetColumnWidth(4, wxLIST_AUTOSIZE_USEHEADER );
294
outputCallGraphArea->SetColumnWidth(4, wxLIST_AUTOSIZE );
206
295
outputCallGraphArea->SetColumnWidth(5, wxLIST_AUTOSIZE);
208
297
// Printing Call Graph Help
209
298
wxString output_help;
210
for ( ; n < msg.GetCount(); ++n )
299
for ( ; count < maxcount; ++count )
212
if (msg[n].Find(0x0C) != -1)
301
if ((count%10) == 0) progress.Update(count);
304
if (TOKEN.Find(wxChar(0x0C)) != -1)
214
output_help << msg[n] << _T("\n");
215
progress.Update((100*n)/(msg.GetCount()-1));
307
output_help << TOKEN << _T("\n");
217
309
outputHelpCallGraphArea->SetValue(output_help);
222
size_t CBProfilerExecDlg::ParseFlatProfile(wxArrayString msg, size_t begin, wxProgressDialog &progress)
314
void CBProfilerExecDlg::ParseFlatProfile(const wxArrayString& msg, wxProgressDialog &progress, const size_t maxcount, size_t &count)
227
316
// Setting colums names
228
outputFlatProfileArea->InsertColumn(0, _T("% time"), wxLIST_FORMAT_CENTRE);
229
outputFlatProfileArea->InsertColumn(1, _T("cum. sec."), wxLIST_FORMAT_CENTRE);
230
outputFlatProfileArea->InsertColumn(2, _T("self sec."), wxLIST_FORMAT_CENTRE);
231
outputFlatProfileArea->InsertColumn(3, _T("calls"), wxLIST_FORMAT_CENTRE);
232
outputFlatProfileArea->InsertColumn(4, _T("self s/call"), wxLIST_FORMAT_CENTRE);
233
outputFlatProfileArea->InsertColumn(5, _T("total s/call"), wxLIST_FORMAT_CENTRE);
317
outputFlatProfileArea->InsertColumn(0, _T("% time"), wxLIST_FORMAT_CENTRE);
318
outputFlatProfileArea->InsertColumn(1, _T("cum. sec."), wxLIST_FORMAT_CENTRE);
319
outputFlatProfileArea->InsertColumn(2, _T("self sec."), wxLIST_FORMAT_CENTRE);
320
outputFlatProfileArea->InsertColumn(3, _T("calls"), wxLIST_FORMAT_CENTRE);
321
outputFlatProfileArea->InsertColumn(4, _T("self ms/call"), wxLIST_FORMAT_CENTRE);
322
outputFlatProfileArea->InsertColumn(5, _T("total ms/call"), wxLIST_FORMAT_CENTRE);
234
323
outputFlatProfileArea->InsertColumn(6, _T("name"));
236
325
// Jump header lines
237
while ((begin < msg.GetCount())&&(msg[begin].Find(_T("time seconds")) == -1))
326
progress.Update(count,_("Parsing flat profile information. Please wait..."));
327
while ((count < maxcount)&&(msg[count].Find(_T("time seconds")) == -1))
243
progress.Update((100*begin)/(msg.GetCount()-1),_("Parsing Flat Profile information. Please wait..."));
333
// Parsing Call Graph
246
335
unsigned int spacePos[6] = {6, 16, 25, 34, 43, 52};
247
// Parsing Call Graph
248
for (n = begin ; n < msg.GetCount(); ++n )
337
for ( ; count < maxcount; ++count )
250
if ((msg[n].IsEmpty())||(msg[n].Find(0x0C) != -1))
339
if ((count%10) == 0) progress.Update(count);
342
if ( (TOKEN.IsEmpty()) || (TOKEN.Find(wxChar(0x0C)) != -1) )
252
345
long item = outputFlatProfileArea->InsertItem(next,_T(""));
253
346
outputFlatProfileArea->SetItemData(item, next);
254
347
// check that we have spaces where spaces are supposed to be
255
if (msg[n].Len() > spacePos[6]) {
256
bool need_parsing = false;
257
for (int i=0; i<6; ++i)
259
if (msg[n][spacePos[i]] != ' ')
265
// if profile output is not in perfect table format
266
// manually parse for space positions
269
int count=0; int i=0; int len = msg[n].Len();
270
while (i < len && count < 6) {
271
// we start with spaces
272
while (msg[n][i] == ' ' && ++i < len);
274
// now we parse everything else than
275
while (msg[n][i] != ' ' && ++i < len);
277
// found a new space position
278
spacePos[count++] = i;
348
if (TOKEN.Len() > spacePos[5]) {
349
bool need_parsing = false;
350
for (int i=0; i<6; ++i)
352
if (TOKEN[spacePos[i]] != ' ')
358
// if profile output is not in perfect table format
359
// manually parse for space positions
362
int count=0; int i=0; int len = TOKEN.Len();
363
while (i < len && count < 6) {
364
// we start with spaces
365
while (TOKEN[i] == ' ' && ++i < len);
367
// now we parse everything else than
368
while (TOKEN[i] != ' ' && ++i < len);
370
// found a new space position
371
spacePos[count++] = i;
283
outputFlatProfileArea->SetItem(next, 0, ((msg[n].Mid(0,spacePos[0])).Trim(true)).Trim(false));
284
for (int i=1; i<6; ++i)
285
outputFlatProfileArea->SetItem(next, i,
286
((msg[n].Mid(spacePos[i-1],spacePos[i] - spacePos[i-1])).Trim(true)).Trim(false));
287
outputFlatProfileArea->SetItem(next, 6, ((msg[n].Mid(spacePos[5])).Trim(true)).Trim(false));
376
outputFlatProfileArea->SetItem(next, 0, ((TOKEN.Mid(0,spacePos[0])).Trim(true)).Trim(false));
377
for (int i(1); i<6; ++i)
378
outputFlatProfileArea->SetItem(next, i,((TOKEN.Mid(spacePos[i-1],spacePos[i] - spacePos[i-1])).Trim(true)).Trim(false));
379
outputFlatProfileArea->SetItem(next, 6, ((TOKEN.Mid(spacePos[5])).Trim(true)).Trim(false));
290
outputFlatProfileArea->SetItem(next, 0, ((msg[n].Mid(0,6)).Trim(true)).Trim(false));
291
outputFlatProfileArea->SetItem(next, 1, ((msg[n].Mid(6,10)).Trim(true)).Trim(false));
292
outputFlatProfileArea->SetItem(next, 2, ((msg[n].Mid(16,9)).Trim(true)).Trim(false));
293
outputFlatProfileArea->SetItem(next, 3, ((msg[n].Mid(25,9)).Trim(true)).Trim(false));
294
outputFlatProfileArea->SetItem(next, 4, ((msg[n].Mid(34,9)).Trim(true)).Trim(false));
295
outputFlatProfileArea->SetItem(next, 5, ((msg[n].Mid(43,9)).Trim(true)).Trim(false));
296
outputFlatProfileArea->SetItem(next, 6, ((msg[n].Mid(52)).Trim(true)).Trim(false));
382
outputFlatProfileArea->SetItem(next, 0, ((TOKEN.Mid(0,6)).Trim(true)).Trim(false));
383
outputFlatProfileArea->SetItem(next, 1, ((TOKEN.Mid(6,10)).Trim(true)).Trim(false));
384
outputFlatProfileArea->SetItem(next, 2, ((TOKEN.Mid(16,9)).Trim(true)).Trim(false));
385
outputFlatProfileArea->SetItem(next, 3, ((TOKEN.Mid(25,9)).Trim(true)).Trim(false));
386
outputFlatProfileArea->SetItem(next, 4, ((TOKEN.Mid(34,9)).Trim(true)).Trim(false));
387
outputFlatProfileArea->SetItem(next, 5, ((TOKEN.Mid(43,9)).Trim(true)).Trim(false));
388
outputFlatProfileArea->SetItem(next, 6, ((TOKEN.Mid(52)).Trim(true)).Trim(false));
298
progress.Update((100*n)/(msg.GetCount()-1));
303
394
outputFlatProfileArea->SetColumnWidth(0, wxLIST_AUTOSIZE_USEHEADER );
304
395
outputFlatProfileArea->SetColumnWidth(1, wxLIST_AUTOSIZE_USEHEADER );
305
396
outputFlatProfileArea->SetColumnWidth(2, wxLIST_AUTOSIZE_USEHEADER );
306
outputFlatProfileArea->SetColumnWidth(3, wxLIST_AUTOSIZE_USEHEADER );
397
outputFlatProfileArea->SetColumnWidth(3, wxLIST_AUTOSIZE );
307
398
outputFlatProfileArea->SetColumnWidth(4, wxLIST_AUTOSIZE_USEHEADER );
308
399
outputFlatProfileArea->SetColumnWidth(5, wxLIST_AUTOSIZE_USEHEADER );
309
400
outputFlatProfileArea->SetColumnWidth(6, wxLIST_AUTOSIZE);
311
wxString output_help;
312
402
// Printing Flat Profile Help
313
for ( ; n < msg.GetCount(); ++n )
403
wxString output_help;
404
for ( ; count < maxcount; ++count )
315
if (msg[n].Find(0x0C) != -1)
406
if ((count%10) == 0) progress.Update(count);
409
if (TOKEN.Find(wxChar(0x0C)) != -1)
317
output_help << msg[n] << _T("\n");
318
progress.Update((100*n)/(msg.GetCount()-1));
412
output_help << msg[count] << _T("\n");
320
414
outputHelpFlatProfileArea->SetValue(output_help);
325
419
// This function writes the gprof output to a file
326
420
void CBProfilerExecDlg::WriteToFile(wxCommandEvent& event)
328
wxFileDialog filedialog(parent, _("Save gprof output to file"),_T(""),_T(""),_T("*.*"),wxSAVE);
422
wxFileDialog filedialog(parent,
423
_("Save gprof output to file"),
330
429
if (filedialog.ShowModal() == wxID_OK)
368
467
item.SetColumn(5);
369
468
item.SetMask(wxLIST_MASK_TEXT);
370
469
outputCallGraphArea->GetItem(item);
371
functionColumn = item.GetText();
372
if (functionColumn.Find(function_name) != -1)
377
// Scrolling to the desired line in the "Call Graph" tab
378
if (n < outputCallGraphArea->GetItemCount())
380
outputCallGraphArea->EnsureVisible(n);
381
XRCCTRL(*this, "tabs", wxNotebook)->SetSelection(1);
385
// Sorting function of the flat profile columns
386
int wxCALLBACK SortFunction(long item1, long item2, long sortData)
388
CBProfilerExecDlg *dialog = (CBProfilerExecDlg*) sortData;
390
wxListCtrl *listCtrl = dialog->GetoutputFlatProfileArea();
391
int col = dialog->GetsortColumn();
392
long itemId1 = listCtrl->FindItem(-1, item1);
393
long itemId2 = listCtrl->FindItem(-1, item2);
395
wxListItem listItem1, listItem2;
397
listItem1.SetId(itemId1);
398
listItem1.SetColumn(col);
399
listItem1.SetMask(wxLIST_MASK_TEXT);
400
listCtrl->GetItem(listItem1);
402
listItem2.SetId(itemId2);
403
listItem2.SetColumn(col);
404
listItem2.SetMask(wxLIST_MASK_TEXT);
405
listCtrl->GetItem(listItem2);
407
// All the columns are composed with numbers except the last one
410
if (dialog->GetsortAscending())
411
return wxStrcmp(listItem1.GetText(), listItem2.GetText());
413
return wxStrcmp(listItem2.GetText(), listItem1.GetText());
418
double success = listItem1.GetText().ToDouble(&num1);
421
if (dialog->GetsortAscending()) return -1;
424
success = listItem2.GetText().ToDouble(&num2);
427
if (dialog->GetsortAscending()) return 1;
430
if (dialog->GetsortAscending())
432
if (num1 < num2) return -1;
433
else if (num1 > num2) return 1;
438
if (num1 > num2) return -1;
439
else if (num1 < num2) return 1;
445
// Function called when a column header is clicked
446
void CBProfilerExecDlg::OnColumnClick(wxListEvent& event)
448
if (event.GetColumn() != sortColumn)
449
sortAscending = true;
451
sortAscending = !sortAscending;
453
sortColumn = event.GetColumn();
454
outputFlatProfileArea->SortItems(SortFunction, (long)this);
470
if (item.GetText().Find(function_name) != -1)
475
// Scrolling to the desired line in the "Call Graph" tab
476
outputCallGraphArea->SetItemState(item,wxLIST_STATE_SELECTED,wxLIST_STATE_SELECTED);
477
outputCallGraphArea->EnsureVisible(n);
478
XRCCTRL(*this, "tabs", wxNotebook)->SetSelection(1);
481
// This function jumps to the selected function in the call graph tab
482
void CBProfilerExecDlg::JumpInCallGraph(wxListEvent& event)
484
// We retrieve the name of the function on the line selected
486
item.SetId(event.GetIndex());
488
item.SetMask(wxLIST_MASK_TEXT);
489
outputCallGraphArea->GetItem(item);
490
const wxString function_name(item.GetText());
492
// Then search this name in the call graph
493
wxString indexColumn;
495
const int maxcount(outputCallGraphArea->GetItemCount());
496
for (n=0; n<maxcount; ++n)
501
item.SetMask(wxLIST_MASK_TEXT);
502
outputCallGraphArea->GetItem(item);
503
indexColumn = item.GetText();
505
if ((indexColumn.Mid(0,1)).CompareTo(_T("[")) == 0)
510
item.SetMask(wxLIST_MASK_TEXT);
511
outputCallGraphArea->GetItem(item);
513
if (function_name.Find(item.GetText()) != wxNOT_FOUND)
518
// Scrolling to the desired line in the "Call Graph" tab
519
outputCallGraphArea->SetItemState(item,wxLIST_STATE_SELECTED,wxLIST_STATE_SELECTED);
520
outputCallGraphArea->EnsureVisible(n);