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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user