Skip to content

Commit

Permalink
Debugger: More work on signal configuration.
Browse files Browse the repository at this point in the history
- Introduce SignalDispositionEditWindow for add/editing disposition
  exceptions.

SignalsConfigView:
- Factor out helper class SignalDispositionMenu. Use accordingly in
  SignalsConfigView and SignalDispositionEditWindow.
- Watch table selection changes to update button statuses appropriately.
- On add/edit request, show disposition edit window.
- Listen for disposition changes from team and react accordingly.

UiUtils:
- Add helper function to map signal defines to strings.

Together with the previous set of commits, this implements #9720.
  • Loading branch information
anevilyak committed Jul 3, 2015
1 parent b66f61a commit b3f2ebf
Show file tree
Hide file tree
Showing 10 changed files with 522 additions and 18 deletions.
2 changes: 2 additions & 0 deletions src/apps/debugger/Jamfile
Original file line number Diff line number Diff line change
Expand Up @@ -299,11 +299,13 @@ Application Debugger :
ActionMenuItem.cpp
GuiSettingsUtils.cpp
SettingsMenu.cpp
SignalDispositionMenu.cpp
TargetAddressTableColumn.cpp

# user_interface/gui/utility_windows
BreakpointEditWindow.cpp
ExpressionPromptWindow.cpp
SignalDispositionEditWindow.cpp
StartTeamWindow.cpp
WatchPromptWindow.cpp

Expand Down
2 changes: 2 additions & 0 deletions src/apps/debugger/MessageCodes.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ enum {
MSG_TEAM_SETTINGS_WINDOW_CLOSED = 'tswc',
MSG_SHOW_BREAKPOINT_EDIT_WINDOW = 'sbew',
MSG_BREAKPOINT_EDIT_WINDOW_CLOSED = 'bewc',
MSG_SHOW_SIGNAL_DISPOSITION_EDIT_WINDOW = 'sdew',
MSG_SIGNAL_DISPOSITION_EDIT_WINDOW_CLOSED = 'sdec',
MSG_SHOW_START_TEAM_WINDOW = 'sstw',
MSG_START_TEAM_WINDOW_CLOSED = 'stwc',
MSG_START_NEW_TEAM = 'sttt',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
#include "table/TableColumns.h"

#include "MessageCodes.h"
#include "SignalDispositionEditWindow.h"
#include "SignalDispositionMenu.h"
#include "SignalDispositionTypes.h"
#include "UiUtils.h"
#include "UserInterface.h"
Expand Down Expand Up @@ -73,18 +75,34 @@ class SignalsConfigView::SignalDispositionModel : public TableModel {

switch (columnIndex) {
case 0:
value = info->signal;
{
BString tempValue;
value.SetTo(UiUtils::SignalNameToString(info->signal,
tempValue));
return true;
}
case 1:
value = info->disposition;
{
value.SetTo(UiUtils::SignalDispositionToString(
info->disposition), B_VARIANT_DONT_COPY_DATA);
return true;
}
default:
break;
}

return false;
}

bool SignalDispositionInfoAt(int32 rowIndex, SignalDispositionInfo*& _info)
{
_info = fDispositions.ItemAt(rowIndex);
if (_info == NULL)
return false;

return true;
}

void Update(int32 signal, int32 disposition)
{
for (int32 i = 0; i < fDispositions.CountItems(); i++) {
Expand Down Expand Up @@ -168,7 +186,8 @@ SignalsConfigView::SignalsConfigView(::Team* team,
fAddDispositionButton(NULL),
fEditDispositionButton(NULL),
fRemoveDispositionButton(NULL),
fDispositionModel(NULL)
fDispositionModel(NULL),
fEditWindow(NULL)
{
SetName("Signals");
fTeam->AddListener(this);
Expand All @@ -178,6 +197,7 @@ SignalsConfigView::SignalsConfigView(::Team* team,
SignalsConfigView::~SignalsConfigView()
{
fTeam->RemoveListener(this);
BMessenger(fEditWindow).SendMessage(B_QUIT_REQUESTED);
}


Expand Down Expand Up @@ -219,6 +239,10 @@ void
SignalsConfigView::MessageReceived(BMessage* message)
{
switch (message->what) {
case MSG_SIGNAL_DISPOSITION_EDIT_WINDOW_CLOSED:
{
fEditWindow = NULL;
}
case MSG_SET_DEFAULT_SIGNAL_DISPOSITION:
{
int32 disposition;
Expand All @@ -229,15 +253,64 @@ SignalsConfigView::MessageReceived(BMessage* message)
break;
}
case MSG_ADD_DISPOSITION_EXCEPTION:
case MSG_EDIT_DISPOSITION_EXCEPTION:
{
if (fEditWindow != NULL) {
AutoLocker<BWindow> lock(fEditWindow);
if (lock.IsLocked())
fEditWindow->Activate(true);
} else {
int32 signal = 0;
if (message->what == MSG_EDIT_DISPOSITION_EXCEPTION) {
TableSelectionModel* model
= fDispositionExceptions->SelectionModel();
SignalDispositionInfo* info;
if (fDispositionModel->SignalDispositionInfoAt(
model->RowAt(0), info)) {
signal = info->signal;
}
}

try {
fEditWindow = SignalDispositionEditWindow::Create(fTeam,
signal, fListener, this);
if (fEditWindow != NULL)
fEditWindow->Show();
} catch (...) {
// TODO: notify user
}
}
break;
}
case MSG_EDIT_DISPOSITION_EXCEPTION:
case MSG_REMOVE_DISPOSITION_EXCEPTION:
{
TableSelectionModel* model
= fDispositionExceptions->SelectionModel();
for (int32 i = 0; i < model->CountRows(); i++) {
SignalDispositionInfo* info;
if (fDispositionModel->SignalDispositionInfoAt(model->RowAt(i),
info)) {
fListener->RemoveCustomSignalDispositionRequested(
info->signal);
}
}
break;
}
case MSG_REMOVE_DISPOSITION_EXCEPTION:
case MSG_SET_CUSTOM_SIGNAL_DISPOSITION:
{
int32 signal;
int32 disposition;
if (message->FindInt32("signal", &signal) == B_OK
&& message->FindInt32("disposition", &disposition) == B_OK) {
fDispositionModel->Update(signal, disposition);
}
break;
}
case MSG_REMOVE_CUSTOM_SIGNAL_DISPOSITION:
{
int32 signal;
if (message->FindInt32("signal", &signal) == B_OK)
fDispositionModel->Remove(signal);
break;
}
default:
Expand All @@ -247,24 +320,45 @@ SignalsConfigView::MessageReceived(BMessage* message)
}


void
SignalsConfigView::CustomSignalDispositionChanged(
const Team::CustomSignalDispositionEvent& event)
{
BMessage message(MSG_SET_CUSTOM_SIGNAL_DISPOSITION);
message.AddInt32("signal", event.Signal());
message.AddInt32("disposition", event.Disposition());

BMessenger(this).SendMessage(&message);
}


void
SignalsConfigView::CustomSignalDispositionRemoved(
const Team::CustomSignalDispositionEvent& event)
{
BMessage message(MSG_REMOVE_CUSTOM_SIGNAL_DISPOSITION);
message.AddInt32("signal", event.Signal());

BMessenger(this).SendMessage(&message);
}


void
SignalsConfigView::TableSelectionChanged(Table* table)
{
TableSelectionModel* model = fDispositionExceptions->SelectionModel();
int32 rowCount = model->CountRows();
fEditDispositionButton->SetEnabled(rowCount == 1);
fRemoveDispositionButton->SetEnabled(rowCount > 0);
}


void
SignalsConfigView::_Init()
{
BMenu* dispositionMenu = new BMenu("signalDispositionsMenu");

for (int i = 0; i < SIGNAL_DISPOSITION_MAX; i++) {
BMessage* message = new BMessage(
MSG_SET_DEFAULT_SIGNAL_DISPOSITION);
message->AddInt32("disposition", i);
dispositionMenu->AddItem(new BMenuItem(
UiUtils::SignalDispositionToString(i), message));
}
SignalDispositionMenu* dispositionMenu = new SignalDispositionMenu(
"signalDispositionsMenu",
new BMessage(MSG_SET_DEFAULT_SIGNAL_DISPOSITION));

BGroupView* customDispositionsGroup = new BGroupView();
BLayoutBuilder::Group<>(customDispositionsGroup, B_VERTICAL, 0.0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

class BButton;
class BMenuField;
class SignalDispositionEditWindow;
class UserInterfaceListener;


Expand All @@ -35,15 +36,21 @@ class SignalsConfigView : public BGroupView, private Team::Listener,
virtual void AttachedToWindow();
virtual void MessageReceived(BMessage* message);

private:
class SignalDispositionModel;

private:
// Team::Listener
virtual void CustomSignalDispositionChanged(
const Team::CustomSignalDispositionEvent&
event);
virtual void CustomSignalDispositionRemoved(
const Team::CustomSignalDispositionEvent&
event);

// TableListener
virtual void TableSelectionChanged(Table* table);

private:
class SignalDispositionModel;

private:
void _Init();

void _UpdateSignalConfigState();
Expand All @@ -58,6 +65,7 @@ class SignalsConfigView : public BGroupView, private Team::Listener,
BButton* fEditDispositionButton;
BButton* fRemoveDispositionButton;
SignalDispositionModel* fDispositionModel;
SignalDispositionEditWindow* fEditWindow;
};


Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* Copyright 2015, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License.
*/


#include "SignalDispositionMenu.h"

#include <new>

#include <MenuItem.h>

#include "SignalDispositionTypes.h"
#include "UiUtils.h"


SignalDispositionMenu::SignalDispositionMenu(const char* label,
BMessage* baseMessage)
:
BMenu(label)
{
for (int i = 0; i < SIGNAL_DISPOSITION_MAX; i++) {
BMessage* message = NULL;
if (baseMessage != NULL) {
message = new BMessage(*baseMessage);
message->AddInt32("disposition", i);
}

AddItem(new BMenuItem(UiUtils::SignalDispositionToString(i), message));
}
}


SignalDispositionMenu::~SignalDispositionMenu()
{
}
20 changes: 20 additions & 0 deletions src/apps/debugger/user_interface/gui/util/SignalDispositionMenu.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Copyright 2015, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License.
*/
#ifndef SIGNAL_DISPOSITION_MENU_H
#define SIGNAL_DISPOSITION_MENU_H


#include <Menu.h>


class SignalDispositionMenu : public BMenu {
public:
SignalDispositionMenu(const char* label,
BMessage* baseMessage = NULL);
virtual ~SignalDispositionMenu();
};


#endif // SIGNAL_DISPOSITION_MENU_H

0 comments on commit b3f2ebf

Please sign in to comment.