From 0b21bf1038b62076d9fe8592e8538f33055878db Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Wed, 5 Nov 2014 22:37:25 -0500 Subject: [PATCH] Debugger: Add simple prompt window for adding expressions. - Requests an expression + type from the user for use elsewhere. Intended to be used by VariablesView and possibly others. --- src/apps/debugger/Jamfile | 1 + src/apps/debugger/MessageCodes.h | 3 + .../team_window/ExpressionPromptWindow.cpp | 185 ++++++++++++++++++ .../gui/team_window/ExpressionPromptWindow.h | 48 +++++ 4 files changed, 237 insertions(+) create mode 100644 src/apps/debugger/user_interface/gui/team_window/ExpressionPromptWindow.cpp create mode 100644 src/apps/debugger/user_interface/gui/team_window/ExpressionPromptWindow.h diff --git a/src/apps/debugger/Jamfile b/src/apps/debugger/Jamfile index 75a30b9efe..192d9409ea 100644 --- a/src/apps/debugger/Jamfile +++ b/src/apps/debugger/Jamfile @@ -270,6 +270,7 @@ Application Debugger : BreakpointsView.cpp ConsoleOutputView.cpp ExpressionEvaluationWindow.cpp + ExpressionPromptWindow.cpp ImageFunctionsView.cpp ImageListView.cpp RegistersView.cpp diff --git a/src/apps/debugger/MessageCodes.h b/src/apps/debugger/MessageCodes.h index fdf07db923..8edb2e8207 100644 --- a/src/apps/debugger/MessageCodes.h +++ b/src/apps/debugger/MessageCodes.h @@ -71,6 +71,9 @@ enum { MSG_INSPECTOR_WINDOW_CLOSED = 'irwc', MSG_SHOW_EXPRESSION_WINDOW = 'seww', MSG_EXPRESSION_WINDOW_CLOSED = 'ewwc', + MSG_SHOW_EXPRESSION_PROMPT_WINDOW = 'sepw', + MSG_ADD_NEW_EXPRESSION = 'anex', + MSG_EXPRESSION_PROMPT_WINDOW_CLOSED = 'epwc', MSG_INSPECT_ADDRESS = 'isad', MSG_EVALUATE_EXPRESSION = 'evex', MSG_EXPRESSION_EVALUATED = 'exev', diff --git a/src/apps/debugger/user_interface/gui/team_window/ExpressionPromptWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/ExpressionPromptWindow.cpp new file mode 100644 index 0000000000..b3f829c68b --- /dev/null +++ b/src/apps/debugger/user_interface/gui/team_window/ExpressionPromptWindow.cpp @@ -0,0 +1,185 @@ +/* + * Copyright 2014, Rene Gollent, rene@gollent.com. + * Distributed under the terms of the MIT License. + */ +#include "ExpressionPromptWindow.h" + +#include +#include +#include +#include +#include + +#include "MessageCodes.h" + + +enum { + MSG_CHANGE_EVALUATION_TYPE = 'chet', +}; + + +ExpressionPromptWindow::ExpressionPromptWindow(BHandler* addTarget, + BHandler* closeTarget) + : + BWindow(BRect(), "Add Expression", B_FLOATING_WINDOW, + B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE), + fExpressionInput(NULL), + fCancelButton(NULL), + fAddButton(NULL), + fAddTarget(addTarget), + fCloseTarget(closeTarget), + fCurrentType(B_INT64_TYPE) +{ +} + + +ExpressionPromptWindow::~ExpressionPromptWindow() +{ +} + + +ExpressionPromptWindow* +ExpressionPromptWindow::Create(BHandler* addTarget, BHandler* closeTarget) +{ + ExpressionPromptWindow* self = new ExpressionPromptWindow(addTarget, + closeTarget); + + try { + self->_Init(); + } catch (...) { + delete self; + throw; + } + + return self; + +} + + +void +ExpressionPromptWindow::_Init() +{ + fExpressionInput = new BTextControl("Expression:", NULL, + new BMessage(MSG_EVALUATE_EXPRESSION)); + BLayoutItem* labelItem = fExpressionInput->CreateLabelLayoutItem(); + BLayoutItem* inputItem = fExpressionInput->CreateTextViewLayoutItem(); + inputItem->SetExplicitMinSize(BSize(200.0, B_SIZE_UNSET)); + inputItem->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET)); + labelItem->View()->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + + 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) + .AddGlue() + .Add((fCancelButton = new BButton("Cancel", + new BMessage(B_QUIT_REQUESTED)))) + .Add((fAddButton = new BButton("Add", + new BMessage(MSG_ADD_NEW_EXPRESSION)))) + .End(); + + fExpressionInput->SetTarget(this); + fCancelButton->SetTarget(this); + fAddButton->SetTarget(this); + fAddButton->MakeDefault(true); + fExpressionInput->TextView()->MakeFocus(true); +} + + +BMenu* +ExpressionPromptWindow::_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; +} + + +void +ExpressionPromptWindow::Show() +{ + CenterOnScreen(); + BWindow::Show(); +} + + +bool +ExpressionPromptWindow::QuitRequested() +{ + BMessenger messenger(fCloseTarget); + messenger.SendMessage(MSG_EXPRESSION_PROMPT_WINDOW_CLOSED); + + return BWindow::QuitRequested(); +} + + +void +ExpressionPromptWindow::MessageReceived(BMessage* message) +{ + switch (message->what) { + case MSG_CHANGE_EVALUATION_TYPE: + { + fCurrentType = message->FindInt32("type"); + break; + } + + case MSG_ADD_NEW_EXPRESSION: + { + BMessage addMessage(message->what); + addMessage.AddString("expression", fExpressionInput->Text()); + addMessage.AddInt32("type", fCurrentType); + + BMessenger(fAddTarget).SendMessage(&addMessage); + PostMessage(B_QUIT_REQUESTED); + break; + } + + default: + BWindow::MessageReceived(message); + break; + } + +} diff --git a/src/apps/debugger/user_interface/gui/team_window/ExpressionPromptWindow.h b/src/apps/debugger/user_interface/gui/team_window/ExpressionPromptWindow.h new file mode 100644 index 0000000000..6f792a0818 --- /dev/null +++ b/src/apps/debugger/user_interface/gui/team_window/ExpressionPromptWindow.h @@ -0,0 +1,48 @@ +/* + * Copyright 2014, Rene Gollent, rene@gollent.com. + * Distributed under the terms of the MIT License. + */ +#ifndef EXPRESSION_PROMPT_WINDOW_H +#define EXPRESSION_PROMPT_WINDOW_H + + +#include + + +class BButton; +class BMenu; +class BTextControl; + + +class ExpressionPromptWindow : public BWindow +{ +public: + ExpressionPromptWindow(BHandler* addTarget, + BHandler* closeTarget); + + ~ExpressionPromptWindow(); + + static ExpressionPromptWindow* Create(BHandler* addTarget, + BHandler* closeTarget); + // throws + + + virtual void MessageReceived(BMessage* message); + + virtual void Show(); + virtual bool QuitRequested(); + +private: + void _Init(); + BMenu* _BuildTypesMenu(); + +private: + BTextControl* fExpressionInput; + BButton* fCancelButton; + BButton* fAddButton; + BHandler* fAddTarget; + BHandler* fCloseTarget; + type_code fCurrentType; +}; + +#endif // EXPRESSION_PROMPT_WINDOW_H