From cda38afb68290ad9158ee270158b8c03f69b7b08 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sun, 26 Oct 2014 14:07:28 -0400 Subject: [PATCH] Debugger: Initial GUI for expression evaluation. - Add a simple interface window for expression evaluation. Not yet accessible from the team window. --- src/apps/debugger/Jamfile | 1 + .../ExpressionEvaluationWindow.cpp | 128 ++++++++++++++++++ .../team_window/ExpressionEvaluationWindow.h | 52 +++++++ 3 files changed, 181 insertions(+) create mode 100644 src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.cpp create mode 100644 src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.h diff --git a/src/apps/debugger/Jamfile b/src/apps/debugger/Jamfile index 300b372547..ca763a86b5 100644 --- a/src/apps/debugger/Jamfile +++ b/src/apps/debugger/Jamfile @@ -264,6 +264,7 @@ Application Debugger : BreakpointListView.cpp BreakpointsView.cpp ConsoleOutputView.cpp + ExpressionEvaluationWindow.cpp ImageFunctionsView.cpp ImageListView.cpp RegistersView.cpp diff --git a/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.cpp new file mode 100644 index 0000000000..fa66aa1fe9 --- /dev/null +++ b/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.cpp @@ -0,0 +1,128 @@ +/* + * Copyright 2014, Rene Gollent, rene@gollent.com. + * Distributed under the terms of the MIT License. + */ +#include "ExpressionEvaluationWindow.h" + +#include +#include +#include +#include +#include +#include + +#include "MessageCodes.h" +#include "SourceLanguage.h" +#include "UserInterface.h" +#include "Value.h" + + +enum { + MSG_EVALUATE_EXPRESSION = 'evex' +}; + + +ExpressionEvaluationWindow::ExpressionEvaluationWindow( + SourceLanguage* language, UserInterfaceListener* listener) + : + BWindow(BRect(), "Evaluate Expression", B_FLOATING_WINDOW, + B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE), + fLanguage(language), + fListener(listener) +{ + fLanguage->AcquireReference(); +} + + +ExpressionEvaluationWindow::~ExpressionEvaluationWindow() +{ + fLanguage->ReleaseReference(); +} + + +ExpressionEvaluationWindow* +ExpressionEvaluationWindow::Create(SourceLanguage* language, + UserInterfaceListener* listener) +{ + ExpressionEvaluationWindow* self = new ExpressionEvaluationWindow( + language, listener); + + try { + self->_Init(); + } catch (...) { + delete self; + throw; + } + + return self; + +} + + +void +ExpressionEvaluationWindow::_Init() +{ + fExpressionInput = new BTextControl("Expression:", NULL, NULL); + BLayoutItem* labelItem = fExpressionInput->CreateLabelLayoutItem(); + labelItem->View()->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + BLayoutBuilder::Group<>(this, B_VERTICAL) + .SetInsets(B_USE_DEFAULT_SPACING) + .AddGroup(B_HORIZONTAL, 4.0f) + .Add(labelItem) + .Add(fExpressionInput->CreateTextViewLayoutItem()) + .End() + .AddGroup(B_HORIZONTAL, 4.0f) + .Add(new BStringView("OutputLabelView", "Result:")) + .Add((fExpressionOutput = new BStringView("ExpressionOutputView", + NULL))) + .End() + .AddGroup(B_HORIZONTAL, 4.0f) + .AddGlue() + .Add((fEvaluateButton = new BButton("Evaluate", + new BMessage(MSG_EVALUATE_EXPRESSION)))) + .End(); + + fEvaluateButton->SetTarget(this); + +} + + +void +ExpressionEvaluationWindow::Show() +{ + CenterOnScreen(); + BWindow::Show(); +} + + +void +ExpressionEvaluationWindow::MessageReceived(BMessage* message) +{ + switch (message->what) { + case MSG_EVALUATE_EXPRESSION: + { + Value* value = NULL; + status_t error = fLanguage->EvaluateExpression( + fExpressionInput->TextView()->Text(), value); + if (error != B_OK) { + BString errorText; + errorText.SetToFormat("Failed to evaluate expression: %s", + strerror(error)); + BAlert* alert = new(std::nothrow) BAlert("Evaluate Expression", + errorText.String(), "Close"); + if (alert != NULL) + alert->Go(); + break; + } + + BString valueText; + value->ToString(valueText); + fExpressionOutput->SetText(valueText); + 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 new file mode 100644 index 0000000000..ba28df4187 --- /dev/null +++ b/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.h @@ -0,0 +1,52 @@ +/* + * Copyright 2014, Rene Gollent, rene@gollent.com. + * Distributed under the terms of the MIT License. + */ +#ifndef EXPRESSION_EVALUATION_WINDOW_H +#define EXPRESSION_EVALUATION_WINDOW_H + + +#include + +#include "types/Types.h" + + +class BButton; +class BStringView; +class BTextControl; +class SourceLanguage; +class UserInterfaceListener; + + +class ExpressionEvaluationWindow : public BWindow +{ +public: + ExpressionEvaluationWindow( + SourceLanguage* language, + UserInterfaceListener* listener); + + ~ExpressionEvaluationWindow(); + + static ExpressionEvaluationWindow* Create( + SourceLanguage* language, + UserInterfaceListener* listener); + // throws + + + virtual void MessageReceived(BMessage* message); + + virtual void Show(); + +private: + void _Init(); + + +private: + SourceLanguage* fLanguage; + BTextControl* fExpressionInput; + BStringView* fExpressionOutput; + BButton* fEvaluateButton; + UserInterfaceListener* fListener; +}; + +#endif // EXPRESSION_EVALUATION_WINDOW_H