diff --git a/src/apps/debugger/Debugger.cpp b/src/apps/debugger/Debugger.cpp index 3b50731218..5c9c74f29e 100644 --- a/src/apps/debugger/Debugger.cpp +++ b/src/apps/debugger/Debugger.cpp @@ -238,11 +238,18 @@ Debugger::MessageReceived(BMessage* message) switch (message->what) { case MSG_SHOW_TEAMS_WINDOW: { - if (fTeamsWindow) + if (fTeamsWindow) { fTeamsWindow->Activate(true); - else { - fTeamsWindow = new(std::nothrow) TeamsWindow(&fSettingsManager); - fTeamsWindow->Show(); + break; + } + + try { + fTeamsWindow = TeamsWindow::Create(&fSettingsManager); + if (fTeamsWindow != NULL) + fTeamsWindow->Show(); + } catch(...) { + // TODO: Notify the user! + fprintf(stderr, "Error: Failed to create Teams window\n"); } break; } @@ -343,8 +350,10 @@ Debugger::ArgvReceived(int32 argc, char** argv) _StartTeamDebugger(team, thread, stopInMain); } + // TeamDebugger::Listener + void Debugger::TeamDebuggerStarted(TeamDebugger* debugger) { diff --git a/src/apps/debugger/user_interface/gui/teams_window/TeamsListView.cpp b/src/apps/debugger/user_interface/gui/teams_window/TeamsListView.cpp index 779478979e..6484724d03 100644 --- a/src/apps/debugger/user_interface/gui/teams_window/TeamsListView.cpp +++ b/src/apps/debugger/user_interface/gui/teams_window/TeamsListView.cpp @@ -3,6 +3,7 @@ * Distributed under the terms of the MIT License. */ +#include #include #include @@ -242,8 +243,11 @@ TeamsListView::MessageReceived(BMessage* message) if (message->FindInt32("be:team", &team) != B_OK) break; - AddItem(new TeamListItem(team)); - SortItems(&TeamListItem::Compare); + TeamListItem* item = new(std::nothrow) TeamListItem(team); + if (item != NULL) { + AddItem(new TeamListItem(team)); + SortItems(&TeamListItem::Compare); + } break; } @@ -324,12 +328,14 @@ TeamsListView::_UpdateList() } if (!item || tmi.team != item->TeamID()) { - // Team not found in known teams list: insert an new item - TeamListItem* newItem = new TeamListItem(tmi); - if (!item) - index++; // No item with team id bigger found: insert at list end + // Team not found in previously known teams list: insert a new item + TeamListItem* newItem = new(std::nothrow) TeamListItem(tmi); + if (newItem != NULL) { + if (!item) + index++; // No item found with bigger team id: insert at end - AddItem(newItem, index); + AddItem(newItem, index); + } } index++; // Move list sync head. } diff --git a/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.cpp b/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.cpp index ef12db75d9..5796936bad 100644 --- a/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.cpp +++ b/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.cpp @@ -26,38 +26,9 @@ TeamsWindow::TeamsWindow(SettingsManager* settingsManager) : BWindow(BRect(100, 100, 500, 250), "Teams", B_DOCUMENT_WINDOW, B_ASYNCHRONOUS_CONTROLS), + fTeamsListView(NULL), fSettingsManager(settingsManager) { - BMessage settings; - _LoadSettings(settings); - - BRect frame; - if (settings.FindRect("teams window frame", &frame) == B_OK) { - MoveTo(frame.LeftTop()); - ResizeTo(frame.Width(), frame.Height()); - } - - // TODO: add button to start a team debugger - // TODO: add UI to setup arguments and environ, launch a program - // and start his team debugger - - // Add a teams list view - frame = Bounds(); - frame.right -= B_V_SCROLL_BAR_WIDTH; - - fTeamsListView = new TeamsListView(frame, "TeamsList"); - fTeamsListView->SetInvocationMessage(new BMessage(kMsgDebugThisTeam)); - - BScrollView * teamsScroller = new BScrollView("TeamsListScroller", - fTeamsListView, B_FOLLOW_ALL_SIDES, 0, false, true, B_NO_BORDER); - - AddChild(teamsScroller); - - // small visual tweak - if (BScrollBar* scrollBar = teamsScroller->ScrollBar(B_VERTICAL)) { - scrollBar->MoveBy(0, -1); - scrollBar->ResizeBy(0, -(B_H_SCROLL_BAR_HEIGHT - 2)); - } } @@ -66,6 +37,22 @@ TeamsWindow::~TeamsWindow() } +/*static*/ TeamsWindow* +TeamsWindow::Create(SettingsManager* settingsManager) +{ + TeamsWindow* self = new TeamsWindow(settingsManager); + + try { + self->_Init(); + } catch(...) { + delete self; + throw; + } + + return self; +} + + void TeamsWindow::MessageReceived(BMessage* message) { @@ -103,6 +90,42 @@ TeamsWindow::QuitRequested() // #pragma mark -- +void +TeamsWindow::_Init() +{ + BMessage settings; + _LoadSettings(settings); + + BRect frame; + if (settings.FindRect("teams window frame", &frame) == B_OK) { + MoveTo(frame.LeftTop()); + ResizeTo(frame.Width(), frame.Height()); + } + + // TODO: add button to start a team debugger + // TODO: add UI to setup arguments and environ, launch a program + // and start his team debugger + + // Add a teams list view + frame = Bounds(); + frame.right -= B_V_SCROLL_BAR_WIDTH; + + fTeamsListView = new TeamsListView(frame, "TeamsList"); + fTeamsListView->SetInvocationMessage(new BMessage(kMsgDebugThisTeam)); + + BScrollView * teamsScroller = new BScrollView("TeamsListScroller", + fTeamsListView, B_FOLLOW_ALL_SIDES, 0, false, true, B_NO_BORDER); + + AddChild(teamsScroller); + + // small visual tweak + if (BScrollBar* scrollBar = teamsScroller->ScrollBar(B_VERTICAL)) { + scrollBar->MoveBy(0, -1); + scrollBar->ResizeBy(0, -(B_H_SCROLL_BAR_HEIGHT - 2)); + } +} + + status_t TeamsWindow::_OpenSettings(BFile& file, uint32 mode) { diff --git a/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.h b/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.h index 7a2568f641..fdc8f15c3c 100644 --- a/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.h +++ b/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.h @@ -19,11 +19,14 @@ public: TeamsWindow(SettingsManager* settingsManager); virtual ~TeamsWindow(); + static TeamsWindow* Create(SettingsManager* settingsManager); + // throws + virtual void MessageReceived(BMessage* message); virtual bool QuitRequested(); private: - + void _Init(); status_t _OpenSettings(BFile& file, uint32 mode); status_t _LoadSettings(BMessage& settings); status_t _SaveSettings();