From f0baa913b6ad6a6a42947aa7740b2532c7fe72e1 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Mon, 27 Oct 2014 13:54:21 -0400 Subject: [PATCH] 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. --- .../ExpressionEvaluationWindow.cpp | 70 ++++++++++++++++++- .../team_window/ExpressionEvaluationWindow.h | 3 + 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.cpp index 4042e482dc..bc841a47c7 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -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; diff --git a/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.h b/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.h index b2b8ef152d..74c6e822e5 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.h +++ b/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.h @@ -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