ultimatepp/uppsrc/ide/Debuggers/Gdb_MI2Explore.cpp
micio 4a8b1bd0b3 Ide/Debuggers/Gdb_MI2 : updated explorer pane
git-svn-id: svn://ultimatepp.org/upp/trunk@6933 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2014-02-19 13:49:19 +00:00

142 lines
3.3 KiB
C++

#include "Debuggers.h"
#include <ide/ide.h>
void Gdb_MI2::doExplore(String const &expr, bool appendHistory)
{
// set the expression inside expression editor
explorerExprEdit = expr;
// update the history : trim it from past current position
// and append it at end
if(appendHistory)
{
if(explorerHistoryPos >= 0)
{
explorerHistoryPos++;
explorerHistoryExpressions.Trim(explorerHistoryPos);
}
else
explorerHistoryPos = 0;
explorerHistoryExpressions.Add(expr);
}
// evaluate the expression, direct deep evaluation here
String s = "<can't evaluate>";
MIValue valExpr = MICmd("data-evaluate-expression " + expr);
if(valExpr.IsTuple() && valExpr.Find("value") >= 0)
{
MIValue const &tup = valExpr.Get("value");
if(tup.IsString())
s = tup.ToString();
}
// special behaviour for pointers and references
// try to de-reference them
if(s.StartsWith("@0x") || s.StartsWith("0x"))
{
MIValue valExpr;
if(s.StartsWith("@0x"))
// reference
valExpr = MICmd("data-evaluate-expression *&" + expr);
else
// pointer
valExpr = MICmd("data-evaluate-expression *" + expr);
if(valExpr.IsTuple() && valExpr.Find("value") >= 0)
{
MIValue const &tup = valExpr.Get("value");
if(tup.IsString())
s = tup.ToString();
}
}
s = expr + "=" + s;
MIValue val(s);
val.PackNames();
AddAttribs("", val);
val.FixArrays();
bool more = TypeSimplify(val, false);
while(more)
more = TypeSimplify(val, true);
// collect results
Vector<String> vals;
Vector<int> hints;
CollectVariables(val, explorerChildExpressions, vals, hints);
// update locals pane
FillPane(explorer, explorerChildExpressions, vals);
// update history buttons visibility
explorerBackBtn.Enable(explorerHistoryPos > 0);
explorerForwardBtn.Enable(explorerHistoryPos < explorerHistoryExpressions.GetCount() - 1);
}
void Gdb_MI2::onExploreExpr(ArrayCtrl *what)
{
String expr;
if(!what)
{
// if expression don't come from another ArrayCtrl
// we use the expression editbox
expr = ~explorerExprEdit;
}
else if(what == &members)
{
int line = what->GetCursor();
if(line >= 0)
expr = thisExpressions[line];
}
else
{
// otherwise, we use the expression from sending ArrayCtrl
int line = what->GetCursor();
int col = what->GetClickColumn();
if(line >= 0 && (what != &watches || col != 0))
expr = what->Get(line, 0);
}
// nothing to do on empty expression
if(expr == "")
return;
doExplore(expr, true);
// activate explorer tab
tab.Set(4);
}
void Gdb_MI2::onExplorerChild()
{
// click on first line (value line) does nothing
int line = explorer.GetCursor();
if(line < 0)
return;
if(line < explorerChildExpressions.GetCount())
doExplore(explorerChildExpressions[line], true);
}
void Gdb_MI2::onExplorerBack()
{
if(explorerHistoryPos < 1)
return;
explorerHistoryPos--;
String expr = explorerHistoryExpressions[explorerHistoryPos];
doExplore(expr, false);
}
void Gdb_MI2::onExplorerForward()
{
if(explorerHistoryPos >= explorerHistoryExpressions.GetCount() - 1)
return;
explorerHistoryPos++;
String expr = explorerHistoryExpressions[explorerHistoryPos];
doExplore(expr, false);
}
void Gdb_MI2::ExplorerMenu(Bar& bar)
{
}