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