Debugger: Add type selector to expression window.

- Allows one to choose the type which the current expression
  should be evaluated as.
- Don't attempt to evaluate expression if the input field is
  currently empty.
This commit is contained in:
Rene Gollent
2014-10-27 13:54:21 -04:00
parent 1cf8b1345e
commit f0baa913b6
2 changed files with 70 additions and 3 deletions
@@ -7,6 +7,7 @@
#include <Alert.h>
#include <Button.h>
#include <LayoutBuilder.h>
#include <MenuField.h>
#include <String.h>
#include <StringView.h>
#include <TextControl.h>
@@ -18,7 +19,8 @@
enum {
MSG_EVALUATE_EXPRESSION = 'evex'
MSG_EVALUATE_EXPRESSION = 'evex',
MSG_CHANGE_EVALUATION_TYPE = 'chet'
};
@@ -30,7 +32,8 @@ ExpressionEvaluationWindow::ExpressionEvaluationWindow(
B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE),
fLanguage(language),
fListener(listener),
fCloseTarget(target)
fCloseTarget(target),
fCurrentEvaluationType(B_INT64_TYPE)
{
fLanguage->AcquireReference();
}
@@ -76,11 +79,16 @@ ExpressionEvaluationWindow::_Init()
fExpressionOutput->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED,
B_SIZE_UNSET));
BMenuField* typeField = new BMenuField("Type:", _BuildTypesMenu());
typeField->Menu()->SetTargetForItems(this);
BLayoutBuilder::Group<>(this, B_VERTICAL)
.SetInsets(B_USE_DEFAULT_SPACING)
.AddGroup(B_HORIZONTAL, 4.0f)
.Add(labelItem)
.Add(inputItem)
.Add(typeField->CreateLabelLayoutItem())
.Add(typeField->CreateMenuBarLayoutItem())
.End()
.AddGroup(B_HORIZONTAL, 4.0f)
.Add(new BStringView("OutputLabelView", "Result:"))
@@ -94,6 +102,51 @@ ExpressionEvaluationWindow::_Init()
fExpressionInput->SetTarget(this);
fEvaluateButton->SetTarget(this);
fExpressionInput->TextView()->MakeFocus(true);
}
BMenu*
ExpressionEvaluationWindow::_BuildTypesMenu()
{
BMenu* menu = new BMenu("Types");
menu->SetLabelFromMarked(true);
BMessage message(MSG_CHANGE_EVALUATION_TYPE);
message.AddInt32("type", B_INT8_TYPE);
menu->AddItem(new BMenuItem("int8", new BMessage(message)));
message.ReplaceInt32("type", B_UINT8_TYPE);
menu->AddItem(new BMenuItem("uint8", new BMessage(message)));
message.ReplaceInt32("type", B_INT16_TYPE);
menu->AddItem(new BMenuItem("int16", new BMessage(message)));
message.ReplaceInt32("type", B_UINT16_TYPE);
menu->AddItem(new BMenuItem("uint16", new BMessage(message)));
message.ReplaceInt32("type", B_INT32_TYPE);
menu->AddItem(new BMenuItem("int32", new BMessage(message)));
message.ReplaceInt32("type", B_UINT32_TYPE);
menu->AddItem(new BMenuItem("uint32", new BMessage(message)));
message.ReplaceInt32("type", B_INT64_TYPE);
BMenuItem* item = new BMenuItem("int64", new BMessage(message));
menu->AddItem(item);
item->SetMarked(true);
message.ReplaceInt32("type", B_UINT64_TYPE);
menu->AddItem(new BMenuItem("uint64", new BMessage(message)));
message.ReplaceInt32("type", B_FLOAT_TYPE);
menu->AddItem(new BMenuItem("float", new BMessage(message)));
message.ReplaceInt32("type", B_DOUBLE_TYPE);
menu->AddItem(new BMenuItem("double", new BMessage(message)));
return menu;
}
@@ -121,10 +174,14 @@ ExpressionEvaluationWindow::MessageReceived(BMessage* message)
switch (message->what) {
case MSG_EVALUATE_EXPRESSION:
{
if (fExpressionInput->TextView()->TextLength() == 0)
break;
Value* value = NULL;
BString outputText;
status_t error = fLanguage->EvaluateExpression(
fExpressionInput->TextView()->Text(), B_INT64_TYPE, value);
fExpressionInput->TextView()->Text(), fCurrentEvaluationType,
value);
if (error != B_OK) {
if (value != NULL)
value->ToString(outputText);
@@ -138,6 +195,13 @@ ExpressionEvaluationWindow::MessageReceived(BMessage* message)
fExpressionOutput->SetText(outputText);
break;
}
case MSG_CHANGE_EVALUATION_TYPE:
{
fCurrentEvaluationType = message->FindInt32("type");
break;
}
default:
BWindow::MessageReceived(message);
break;
@@ -11,6 +11,7 @@
#include "types/Types.h"
class BMenu;
class BButton;
class BStringView;
class BTextControl;
@@ -42,6 +43,7 @@ public:
private:
void _Init();
BMenu* _BuildTypesMenu();
private:
@@ -51,6 +53,7 @@ private:
BButton* fEvaluateButton;
UserInterfaceListener* fListener;
BHandler* fCloseTarget;
type_code fCurrentEvaluationType;
};
#endif // EXPRESSION_EVALUATION_WINDOW_H