From e59fc195db7c15e8873ee257d457ac837d572270 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Fri, 3 Jul 2009 12:25:09 +0000 Subject: [PATCH] * ThreadListView: - Got rid of superfluous SetTeam(). - Aded SetThread() to select a thread. * TeamWindow: When a thread hits a debug event and no thread is selected or the selected thread is running, select the stopped thread and switch to the "Threads" tab view. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31390 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../debugger/gui/team_window/TeamWindow.cpp | 40 ++++++++++++--- .../gui/team_window/ThreadListView.cpp | 49 +++++++++++-------- .../debugger/gui/team_window/ThreadListView.h | 7 +-- 3 files changed, 65 insertions(+), 31 deletions(-) diff --git a/src/apps/debugger/gui/team_window/TeamWindow.cpp b/src/apps/debugger/gui/team_window/TeamWindow.cpp index c5678d3c57..baa677461a 100644 --- a/src/apps/debugger/gui/team_window/TeamWindow.cpp +++ b/src/apps/debugger/gui/team_window/TeamWindow.cpp @@ -27,6 +27,12 @@ #include "StackTraceView.h" +enum { + MAIN_TAB_INDEX_THREADS = 0, + MAIN_TAB_INDEX_IMAGES = 1 +}; + + // #pragma mark - TeamWindow @@ -286,6 +292,8 @@ function, function->GetSourceCode(), function->SourceCodeState()); void TeamWindow::_Init() { + ::Team* team = fDebugModel->GetTeam(); + BScrollView* sourceScrollView; BLayoutBuilder::Group<>(this, B_VERTICAL) @@ -317,7 +325,7 @@ TeamWindow::_Init() threadGroup->SetName("Threads"); fTabView->AddTab(threadGroup); BLayoutBuilder::Split<>(threadGroup) - .Add(fThreadListView = ThreadListView::Create(this)) + .Add(fThreadListView = ThreadListView::Create(team, this)) .Add(fStackTraceView = StackTraceView::Create(this)); // add images tab @@ -325,8 +333,7 @@ TeamWindow::_Init() imagesGroup->SetName("Images"); fTabView->AddTab(imagesGroup); BLayoutBuilder::Split<>(imagesGroup) - .Add(fImageListView = ImageListView::Create(fDebugModel->GetTeam(), - this)) + .Add(fImageListView = ImageListView::Create(team, this)) .Add(fImageFunctionsView = ImageFunctionsView::Create(this)); // add local variables tab @@ -337,8 +344,6 @@ TeamWindow::_Init() tab = fRegisterView = RegisterView::Create(fDebugModel->GetArchitecture()); fLocalsTabView->AddTab(tab); - fThreadListView->SetTeam(fDebugModel->GetTeam()); - fRunButton->SetMessage(new BMessage(MSG_THREAD_RUN)); fStepOverButton->SetMessage(new BMessage(MSG_THREAD_STEP_OVER)); fStepIntoButton->SetMessage(new BMessage(MSG_THREAD_STEP_INTO)); @@ -377,6 +382,8 @@ TeamWindow::_SetActiveThread(::Thread* thread) locker.Unlock(); + fThreadListView->SetThread(fActiveThread); + _SetActiveStackTrace(stackTrace); _UpdateCpuState(); } @@ -597,11 +604,28 @@ TeamWindow::_UpdateRunButtons() void TeamWindow::_HandleThreadStateChanged(thread_id threadID) { - // ATM we're only interested in the currently selected thread - if (fActiveThread == NULL || threadID != fActiveThread->ID()) + AutoLocker locker(fDebugModel); + + ::Thread* thread = fDebugModel->GetTeam()->ThreadByID(threadID); + if (thread == NULL) return; - AutoLocker locker(fDebugModel); + // If the thread has been stopped and we don't have an active thread yet + // (or it isn't stopped), switch to this thread. Otherwise ignore the event. + if (thread->State() == THREAD_STATE_STOPPED + && (fActiveThread == NULL + || (thread != fActiveThread + && fActiveThread->State() != THREAD_STATE_STOPPED))) { + _SetActiveThread(thread); + } else if (thread != fActiveThread) { + // otherwise ignore the event, if the thread is not the active one + return; + } + + // Switch to the threads tab view when the thread has stopped. + if (thread->State() == THREAD_STATE_STOPPED) + fTabView->Select(MAIN_TAB_INDEX_THREADS); + _UpdateRunButtons(); } diff --git a/src/apps/debugger/gui/team_window/ThreadListView.cpp b/src/apps/debugger/gui/team_window/ThreadListView.cpp index 30c556da92..84a30de81e 100644 --- a/src/apps/debugger/gui/team_window/ThreadListView.cpp +++ b/src/apps/debugger/gui/team_window/ThreadListView.cpp @@ -129,10 +129,11 @@ private: // #pragma mark - ThreadListView -ThreadListView::ThreadListView(Listener* listener) +ThreadListView::ThreadListView(Team* team, Listener* listener) : BGroupView(B_VERTICAL), - fTeam(NULL), + fTeam(team), + fThread(NULL), fThreadsTable(NULL), fThreadsTableModel(NULL), fListener(listener) @@ -143,16 +144,16 @@ ThreadListView::ThreadListView(Listener* listener) ThreadListView::~ThreadListView() { - SetTeam(NULL); + fTeam->RemoveListener(this); fThreadsTable->SetTableModel(NULL); delete fThreadsTableModel; } /*static*/ ThreadListView* -ThreadListView::Create(Listener* listener) +ThreadListView::Create(Team* team, Listener* listener) { - ThreadListView* self = new ThreadListView(listener); + ThreadListView* self = new ThreadListView(team, listener); try { self->_Init(); @@ -173,26 +174,29 @@ ThreadListView::UnsetListener() void -ThreadListView::SetTeam(Team* team) +ThreadListView::SetThread(Thread* thread) { - if (team == fTeam) + if (thread == fThread) return; - if (fTeam != NULL) { - fTeam->RemoveListener(this); - fThreadsTable->SetTableModel(NULL); - delete fThreadsTableModel; - fThreadsTableModel = NULL; + if (fThread != NULL) + fThread->ReleaseReference(); + + fThread = thread; + + if (fThread != NULL) { + fThread->AcquireReference(); + + for (int32 i = 0; Thread* other = fThreadsTableModel->ThreadAt(i); + i++) { + if (fThread == other) { + fThreadsTable->SelectRow(i, false); + return; + } + } } - fTeam = team; - - if (fTeam != NULL) { - fThreadsTableModel = new(std::nothrow) ThreadsTableModel(fTeam); - fThreadsTable->SetTableModel(fThreadsTableModel); - fThreadsTable->ResizeAllColumnsToPreferred(); - fTeam->AddListener(this); - } + fThreadsTable->DeselectAllRows(); } @@ -256,6 +260,11 @@ ThreadListView::_Init() fThreadsTable->SetSelectionMode(B_SINGLE_SELECTION_LIST); fThreadsTable->AddTableListener(this); + + fThreadsTableModel = new(std::nothrow) ThreadsTableModel(fTeam); + fThreadsTable->SetTableModel(fThreadsTableModel); + fThreadsTable->ResizeAllColumnsToPreferred(); + fTeam->AddListener(this); } diff --git a/src/apps/debugger/gui/team_window/ThreadListView.h b/src/apps/debugger/gui/team_window/ThreadListView.h index e9d8a94771..3161af3aca 100644 --- a/src/apps/debugger/gui/team_window/ThreadListView.h +++ b/src/apps/debugger/gui/team_window/ThreadListView.h @@ -20,15 +20,15 @@ public: class Listener; public: - ThreadListView(Listener* listener); + ThreadListView(Team* team, Listener* listener); ~ThreadListView(); - static ThreadListView* Create(Listener* listener); + static ThreadListView* Create(Team* team, Listener* listener); // throws void UnsetListener(); - void SetTeam(Team* team); + void SetThread(Thread* thread); virtual void MessageReceived(BMessage* message); @@ -47,6 +47,7 @@ private: private: Team* fTeam; + Thread* fThread; Table* fThreadsTable; ThreadsTableModel* fThreadsTableModel; Listener* fListener;