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 <Alert.h>
#include <Button.h> #include <Button.h>
#include <LayoutBuilder.h> #include <LayoutBuilder.h>
#include <MenuField.h>
#include <String.h> #include <String.h>
#include <StringView.h> #include <StringView.h>
#include <TextControl.h> #include <TextControl.h>
@@ -18,7 +19,8 @@
enum { 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), B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE),
fLanguage(language), fLanguage(language),
fListener(listener), fListener(listener),
fCloseTarget(target) fCloseTarget(target),
fCurrentEvaluationType(B_INT64_TYPE)
{ {
fLanguage->AcquireReference(); fLanguage->AcquireReference();
} }
@@ -76,11 +79,16 @@ ExpressionEvaluationWindow::_Init()
fExpressionOutput->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, fExpressionOutput->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED,
B_SIZE_UNSET)); B_SIZE_UNSET));
BMenuField* typeField = new BMenuField("Type:", _BuildTypesMenu());
typeField->Menu()->SetTargetForItems(this);
BLayoutBuilder::Group<>(this, B_VERTICAL) BLayoutBuilder::Group<>(this, B_VERTICAL)
.SetInsets(B_USE_DEFAULT_SPACING) .SetInsets(B_USE_DEFAULT_SPACING)
.AddGroup(B_HORIZONTAL, 4.0f) .AddGroup(B_HORIZONTAL, 4.0f)
.Add(labelItem) .Add(labelItem)
.Add(inputItem) .Add(inputItem)
.Add(typeField->CreateLabelLayoutItem())
.Add(typeField->CreateMenuBarLayoutItem())
.End() .End()
.AddGroup(B_HORIZONTAL, 4.0f) .AddGroup(B_HORIZONTAL, 4.0f)
.Add(new BStringView("OutputLabelView", "Result:")) .Add(new BStringView("OutputLabelView", "Result:"))
@@ -94,6 +102,51 @@ ExpressionEvaluationWindow::_Init()
fExpressionInput->SetTarget(this); fExpressionInput->SetTarget(this);
fEvaluateButton->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) { switch (message->what) {
case MSG_EVALUATE_EXPRESSION: case MSG_EVALUATE_EXPRESSION:
{ {
if (fExpressionInput->TextView()->TextLength() == 0)
break;
Value* value = NULL; Value* value = NULL;
BString outputText; BString outputText;
status_t error = fLanguage->EvaluateExpression( status_t error = fLanguage->EvaluateExpression(
fExpressionInput->TextView()->Text(), B_INT64_TYPE, value); fExpressionInput->TextView()->Text(), fCurrentEvaluationType,
value);
if (error != B_OK) { if (error != B_OK) {
if (value != NULL) if (value != NULL)
value->ToString(outputText); value->ToString(outputText);
@@ -138,6 +195,13 @@ ExpressionEvaluationWindow::MessageReceived(BMessage* message)
fExpressionOutput->SetText(outputText); fExpressionOutput->SetText(outputText);
break; break;
} }
case MSG_CHANGE_EVALUATION_TYPE:
{
fCurrentEvaluationType = message->FindInt32("type");
break;
}
default: default:
BWindow::MessageReceived(message); BWindow::MessageReceived(message);
break; break;
@@ -11,6 +11,7 @@
#include "types/Types.h" #include "types/Types.h"
class BMenu;
class BButton; class BButton;
class BStringView; class BStringView;
class BTextControl; class BTextControl;
@@ -42,6 +43,7 @@ public:
private: private:
void _Init(); void _Init();
BMenu* _BuildTypesMenu();
private: private:
@@ -51,6 +53,7 @@ private:
BButton* fEvaluateButton; BButton* fEvaluateButton;
UserInterfaceListener* fListener; UserInterfaceListener* fListener;
BHandler* fCloseTarget; BHandler* fCloseTarget;
type_code fCurrentEvaluationType;
}; };
#endif // EXPRESSION_EVALUATION_WINDOW_H #endif // EXPRESSION_EVALUATION_WINDOW_H