[haiku-commits] haiku: hrev45831 - in src/apps/debugger: user_interface/gui/team_window model controllers

  • From: anevilyak@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 7 Jul 2013 06:39:20 +0200 (CEST)

hrev45831 adds 4 changesets to branch 'master'
old head: 9cb70c69b648edb33b207373ef856424b96949b2
new head: 9a14c8a25d0830ca07334ad3339d3f3b1bb588e3
overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=9a14c8a+%5E9cb70c6

----------------------------------------------------------------------------

ef2d649: ExceptionConfigWindow -> BreakConditionConfigWindow.
  
  Stop on image load removed from BreakpointsView, pending adding it to
  BreakConditionConfigWindow with some additional options.

adc742c: Rework layout of BreakConditionConfigWindow.
  
  - Place exception-related settings into their own BBox.
  - Add another box for image load-related settings. This will eventually
    allow one to constrain the stop on image load option to limit itself
    to specific image names. Not yet functional.

cae8421: Implement debugger infrastructure for stop on...
  
  ...image load with name matching.
  
  - Move the stop on image load setting to Team, along with a new setting
  governing the use of the (also newly added) name list.
  
  - Add accessors for maintaining the name list, and events/notifications
  for listeners with regards to changes to all stop on image load
  settings.
  
  - Adjust user interface listener hooks for additional functionality.

9a14c8a: Implement configuration for stop on image load with names.
  
  - BreakConditionConfigWindow is now a team listener so it can watch for
  the appropriate events.
  - Implement reading/maintaining state in response to the various
  notifications.
  - Implement adding/removing names and enabling/disabling the use of the
  name list.

                                      [ Rene Gollent <anevilyak@xxxxxxxxx> ]

----------------------------------------------------------------------------

15 files changed, 828 insertions(+), 292 deletions(-)
src/apps/debugger/Jamfile                        |   2 +-
src/apps/debugger/MessageCodes.h                 |   9 +-
src/apps/debugger/controllers/TeamDebugger.cpp   |  76 +++-
src/apps/debugger/controllers/TeamDebugger.h     |  11 +-
src/apps/debugger/model/Team.cpp                 | 123 ++++-
src/apps/debugger/model/Team.h                   |  65 +++
src/apps/debugger/user_interface/UserInterface.h |   7 +-
.../team_window/BreakConditionConfigWindow.cpp   | 455 +++++++++++++++++++
.../gui/team_window/BreakConditionConfigWindow.h |  81 ++++
.../gui/team_window/BreakpointsView.cpp          |  19 +-
.../gui/team_window/BreakpointsView.h            |   3 -
.../gui/team_window/ExceptionConfigWindow.cpp    | 180 --------
.../gui/team_window/ExceptionConfigWindow.h      |  55 ---
.../gui/team_window/TeamWindow.cpp               |  28 +-
.../user_interface/gui/team_window/TeamWindow.h  |   6 +-

############################################################################

Commit:      ef2d649d76723c303957b2d5da5abde668753741
URL:         http://cgit.haiku-os.org/haiku/commit/?id=ef2d649
Author:      Rene Gollent <anevilyak@xxxxxxxxx>
Date:        Sat Jul  6 16:53:37 2013 UTC

ExceptionConfigWindow -> BreakConditionConfigWindow.

Stop on image load removed from BreakpointsView, pending adding it to
BreakConditionConfigWindow with some additional options.

----------------------------------------------------------------------------

diff --git a/src/apps/debugger/Jamfile b/src/apps/debugger/Jamfile
index ed049c8..aaf52c5 100644
--- a/src/apps/debugger/Jamfile
+++ b/src/apps/debugger/Jamfile
@@ -242,10 +242,10 @@ Application Debugger :
        TeamsListView.cpp
 
        # user_interface/gui/team_window
+       BreakConditionConfigWindow.cpp
        BreakpointListView.cpp
        BreakpointsView.cpp
        ConsoleOutputView.cpp
-       ExceptionConfigWindow.cpp
        ImageFunctionsView.cpp
        ImageListView.cpp
        RegistersView.cpp
diff --git a/src/apps/debugger/MessageCodes.h b/src/apps/debugger/MessageCodes.h
index bf5284c..288eea8 100644
--- a/src/apps/debugger/MessageCodes.h
+++ b/src/apps/debugger/MessageCodes.h
@@ -54,8 +54,8 @@ enum {
        MSG_TEAM_RESTART_REQUESTED                                      = 
'trrq',
        MSG_SHOW_TEAMS_WINDOW                                           = 
'stsw',
        MSG_TEAMS_WINDOW_CLOSED                                         = 
'tswc',
-       MSG_SHOW_EXCEPTION_CONFIG_WINDOW                        = 'secw',
-       MSG_EXCEPTION_CONFIG_WINDOW_CLOSED                      = 'ecwc',
+       MSG_SHOW_BREAK_CONDITION_CONFIG_WINDOW          = 'sbcc',
+       MSG_BREAK_CONDITION_CONFIG_WINDOW_CLOSED        = 'bccw',
        MSG_START_NEW_TEAM                                                      
= 'sttt',
        MSG_DEBUG_THIS_TEAM                                                     
= 'dbtt',
        MSG_SHOW_INSPECTOR_WINDOW                                       = 
'sirw',
diff --git 
a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.cpp 
b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp
similarity index 80%
rename from 
src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.cpp
rename to 
src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp
index d0a01a1..1406d10 100644
--- a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.cpp
+++ 
b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp
@@ -2,7 +2,7 @@
  * Copyright 2013, Rene Gollent, rene@xxxxxxxxxxx.
  * Distributed under the terms of the MIT License.
  */
-#include "ExceptionConfigWindow.h"
+#include "BreakConditionConfigWindow.h"
 
 #include <Button.h>
 #include <CheckBox.h>
@@ -24,10 +24,10 @@ enum {
 };
 
 
-ExceptionConfigWindow::ExceptionConfigWindow(::Team* team,
+BreakConditionConfigWindow::BreakConditionConfigWindow(::Team* team,
        UserInterfaceListener* listener, BHandler* target)
        :
-       BWindow(BRect(), "Configure Exceptions", B_FLOATING_WINDOW,
+       BWindow(BRect(), "Configure break conditions", B_FLOATING_WINDOW,
                B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE),
        fTeam(team),
        fListener(listener),
@@ -39,18 +39,18 @@ ExceptionConfigWindow::ExceptionConfigWindow(::Team* team,
 }
 
 
-ExceptionConfigWindow::~ExceptionConfigWindow()
+BreakConditionConfigWindow::~BreakConditionConfigWindow()
 {
-       BMessenger(fTarget).SendMessage(MSG_EXCEPTION_CONFIG_WINDOW_CLOSED);
+       
BMessenger(fTarget).SendMessage(MSG_BREAK_CONDITION_CONFIG_WINDOW_CLOSED);
 }
 
 
-ExceptionConfigWindow*
-ExceptionConfigWindow::Create(::Team* team,
+BreakConditionConfigWindow*
+BreakConditionConfigWindow::Create(::Team* team,
        UserInterfaceListener* listener, BHandler* target)
 {
-       ExceptionConfigWindow* self = new ExceptionConfigWindow(team, listener,
-               target);
+       BreakConditionConfigWindow* self = new BreakConditionConfigWindow(
+               team, listener, target);
 
        try {
                self->_Init();
@@ -64,7 +64,7 @@ ExceptionConfigWindow::Create(::Team* team,
 }
 
 void
-ExceptionConfigWindow::MessageReceived(BMessage* message)
+BreakConditionConfigWindow::MessageReceived(BMessage* message)
 {
        switch (message->what) {
                case MSG_STOP_ON_THROWN_EXCEPTION_CHANGED:
@@ -87,7 +87,7 @@ ExceptionConfigWindow::MessageReceived(BMessage* message)
 
 
 void
-ExceptionConfigWindow::Show()
+BreakConditionConfigWindow::Show()
 {
        CenterOnScreen();
        BWindow::Show();
@@ -95,7 +95,7 @@ ExceptionConfigWindow::Show()
 
 
 void
-ExceptionConfigWindow::_Init()
+BreakConditionConfigWindow::_Init()
 {
        BLayoutBuilder::Group<>(this, B_VERTICAL)
                .SetInsets(B_USE_DEFAULT_SPACING)
@@ -140,7 +140,7 @@ ExceptionConfigWindow::_Init()
 
 
 void
-ExceptionConfigWindow::_UpdateThrownBreakpoints(bool enable)
+BreakConditionConfigWindow::_UpdateThrownBreakpoints(bool enable)
 {
        AutoLocker< ::Team> teamLocker(fTeam);
        for (ImageList::ConstIterator it = fTeam->Images().GetIterator();
@@ -161,7 +161,7 @@ ExceptionConfigWindow::_UpdateThrownBreakpoints(bool enable)
 
 
 status_t
-ExceptionConfigWindow::_FindExceptionFunction(ImageDebugInfo* info,
+BreakConditionConfigWindow::_FindExceptionFunction(ImageDebugInfo* info,
        target_addr_t& _foundAddress) const
 {
        if (info != NULL) {
diff --git 
a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h 
b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h
similarity index 73%
rename from 
src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h
rename to 
src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h
index 2fc15ab..fc9eccd 100644
--- a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h
+++ 
b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h
@@ -2,8 +2,8 @@
  * Copyright 2013, Rene Gollent, rene@xxxxxxxxxxx.
  * Distributed under the terms of the MIT License.
  */
-#ifndef EXCEPTION_CONFIG_WINDOW_H
-#define EXCEPTION_CONFIG_WINDOW_H
+#ifndef BREAK_CONDITION_CONFIG_WINDOW_H
+#define BREAK_CONDITION_CONFIG_WINDOW_H
 
 
 #include <Window.h>
@@ -18,15 +18,15 @@ class Team;
 class UserInterfaceListener;
 
 
-class ExceptionConfigWindow : public BWindow {
+class BreakConditionConfigWindow : public BWindow {
 public:
-                                                               
ExceptionConfigWindow(::Team* team,
+                                                               
BreakConditionConfigWindow(::Team* team,
                                                                        
UserInterfaceListener* listener,
                                                                        
BHandler* target);
 
-                                                               
~ExceptionConfigWindow();
+                                                               
~BreakConditionConfigWindow();
 
-       static  ExceptionConfigWindow* Create(::Team* team,
+       static  BreakConditionConfigWindow* Create(::Team* team,
                                                                        
UserInterfaceListener* listener,
                                                                        
BHandler* target);
                                                                        // 
throws
@@ -52,4 +52,4 @@ private:
 };
 
 
-#endif // EXCEPTION_CONFIG_WINDOW_H
+#endif // BREAK_CONDITION_CONFIG_WINDOW_H
diff --git 
a/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.cpp 
b/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.cpp
index 1f047cf..f1eaacb 100644
--- a/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.cpp
+++ b/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.cpp
@@ -32,7 +32,6 @@ BreakpointsView::BreakpointsView(Team* team, Listener* 
listener)
        fConfigureExceptionsButton(NULL),
        fToggleBreakpointButton(NULL),
        fRemoveBreakpointButton(NULL),
-       fStopOnImageLoadCheckBox(NULL),
        fListener(listener)
 {
        SetName("Breakpoints");
@@ -97,13 +96,6 @@ BreakpointsView::MessageReceived(BMessage* message)
                        _HandleBreakpointAction(message->what);
                        break;
 
-               case MSG_STOP_ON_IMAGE_LOAD:
-               {
-                       fListener->SetStopOnImageLoadRequested(
-                               fStopOnImageLoadCheckBox->Value() == 
B_CONTROL_ON);
-                       break;
-               }
-               default:
                        BGroupView::MessageReceived(message);
                        break;
        }
@@ -116,7 +108,6 @@ BreakpointsView::AttachedToWindow()
        fConfigureExceptionsButton->SetTarget(Window());
        fToggleBreakpointButton->SetTarget(this);
        fRemoveBreakpointButton->SetTarget(this);
-       fStopOnImageLoadCheckBox->SetTarget(this);
 }
 
 
@@ -162,22 +153,16 @@ BreakpointsView::_Init()
                .AddGroup(B_HORIZONTAL, B_USE_SMALL_SPACING)
                        .SetInsets(B_USE_SMALL_SPACING)
                        .AddGlue()
-                       .Add(fStopOnImageLoadCheckBox = new BCheckBox(
-                               "Stop on image load"))
-                       .AddStrut(5)
                        .Add(fConfigureExceptionsButton = new BButton(
-                               "Configure exceptions" B_UTF8_ELLIPSIS))
+                               "Configure break conditions" B_UTF8_ELLIPSIS))
                        .Add(fRemoveBreakpointButton = new BButton("Remove"))
                        .Add(fToggleBreakpointButton = new BButton("Toggle"))
                .End();
 
        fConfigureExceptionsButton->SetMessage(
-               new BMessage(MSG_SHOW_EXCEPTION_CONFIG_WINDOW));
+               new BMessage(MSG_SHOW_BREAK_CONDITION_CONFIG_WINDOW));
        fToggleBreakpointButton->SetMessage(new 
BMessage(MSG_ENABLE_BREAKPOINT));
        fRemoveBreakpointButton->SetMessage(new BMessage(MSG_CLEAR_BREAKPOINT));
-       fStopOnImageLoadCheckBox->SetMessage(new 
BMessage(MSG_STOP_ON_IMAGE_LOAD));
-       fStopOnImageLoadCheckBox->SetExplicitAlignment(
-               BAlignment(B_ALIGN_HORIZONTAL_UNSET, B_ALIGN_VERTICAL_CENTER));
 
        _UpdateButtons();
 }
diff --git a/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.h 
b/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.h
index 45504df..ea10f93 100644
--- a/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.h
+++ b/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.h
@@ -58,7 +58,6 @@ private:
                        BButton*                        
fConfigureExceptionsButton;
                        BButton*                        fToggleBreakpointButton;
                        BButton*                        fRemoveBreakpointButton;
-                       BCheckBox*                      
fStopOnImageLoadCheckBox;
                        Listener*                       fListener;
 };
 
@@ -81,8 +80,6 @@ public:
                                                                        bool 
enabled) = 0;
        virtual void                            ClearWatchpointRequested(
                                                                        
Watchpoint* watchpoint) = 0;
-
-       virtual void                            
SetStopOnImageLoadRequested(bool enabled) = 0;
 };
 
 
diff --git a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp 
b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp
index 99088fd..de8cda1 100644
--- a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp
+++ b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp
@@ -33,7 +33,7 @@
 #include "ConsoleOutputView.h"
 #include "CpuState.h"
 #include "DisassembledCode.h"
-#include "ExceptionConfigWindow.h"
+#include "BreakConditionConfigWindow.h"
 #include "FileSourceCode.h"
 #include "GuiSettingsUtils.h"
 #include "GuiTeamUiSettings.h"
@@ -128,7 +128,7 @@ TeamWindow::TeamWindow(::Team* team, UserInterfaceListener* 
listener)
        fImageSplitView(NULL),
        fThreadSplitView(NULL),
        fConsoleSplitView(NULL),
-       fExceptionConfigWindow(NULL),
+       fBreakConditionConfigWindow(NULL),
        fInspectorWindow(NULL),
        fFilePanel(NULL)
 {
@@ -318,25 +318,26 @@ TeamWindow::MessageReceived(BMessage* message)
                        break;
 
                }
-               case MSG_SHOW_EXCEPTION_CONFIG_WINDOW:
+               case MSG_SHOW_BREAK_CONDITION_CONFIG_WINDOW:
                {
-                       if (fExceptionConfigWindow) {
-                               fExceptionConfigWindow->Activate(true);
+                       if (fBreakConditionConfigWindow) {
+                               fBreakConditionConfigWindow->Activate(true);
                        } else {
                                try {
-                                       fExceptionConfigWindow = 
ExceptionConfigWindow::Create(
+                                       fBreakConditionConfigWindow
+                                               = 
BreakConditionConfigWindow::Create(
                                                fTeam, fListener, this);
-                                       if (fExceptionConfigWindow != NULL)
-                                               fExceptionConfigWindow->Show();
+                                       if (fBreakConditionConfigWindow != NULL)
+                                               
fBreakConditionConfigWindow->Show();
                        } catch (...) {
                                // TODO: notify user
                        }
                        }
                        break;
                }
-               case MSG_EXCEPTION_CONFIG_WINDOW_CLOSED:
+               case MSG_BREAK_CONDITION_CONFIG_WINDOW_CLOSED:
                {
-                       fExceptionConfigWindow = NULL;
+                       fBreakConditionConfigWindow = NULL;
                        break;
                }
                case MSG_SHOW_WATCH_VARIABLE_PROMPT:
@@ -769,13 +770,6 @@ TeamWindow::ClearWatchpointRequested(Watchpoint* 
watchpoint)
 
 
 void
-TeamWindow::SetStopOnImageLoadRequested(bool enabled)
-{
-       fListener->SetStopOnImageLoadRequested(enabled);
-}
-
-
-void
 TeamWindow::ValueNodeValueRequested(CpuState* cpuState,
        ValueNodeContainer* container, ValueNode* valueNode)
 {
diff --git a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.h 
b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.h
index 9db8453..3ce6736 100644
--- a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.h
+++ b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.h
@@ -31,7 +31,7 @@ class BSplitView;
 class BStringView;
 class BTabView;
 class ConsoleOutputView;
-class ExceptionConfigWindow;
+class BreakConditionConfigWindow;
 class Image;
 class InspectorWindow;
 class RegistersView;
@@ -104,8 +104,6 @@ private:
        virtual void                            ClearWatchpointRequested(
                                                                        
Watchpoint* watchpoint);
 
-       virtual void                            
SetStopOnImageLoadRequested(bool enabled);
-
 
        // SourceView::Listener
        virtual void                            
SetBreakpointRequested(target_addr_t address,
@@ -208,7 +206,7 @@ private:
                        BSplitView*                     fImageSplitView;
                        BSplitView*                     fThreadSplitView;
                        BSplitView*                     fConsoleSplitView;
-                       ExceptionConfigWindow* fExceptionConfigWindow;
+                       BreakConditionConfigWindow* fBreakConditionConfigWindow;
                        InspectorWindow*        fInspectorWindow;
                        GuiTeamUiSettings       fUiSettings;
                        BFilePanel*                     fFilePanel;

############################################################################

Commit:      adc742c508ecf09a80a1060b93d053b4edad3b4f
URL:         http://cgit.haiku-os.org/haiku/commit/?id=adc742c
Author:      Rene Gollent <anevilyak@xxxxxxxxx>
Date:        Sat Jul  6 17:34:51 2013 UTC

Rework layout of BreakConditionConfigWindow.

- Place exception-related settings into their own BBox.
- Add another box for image load-related settings. This will eventually
  allow one to constrain the stop on image load option to limit itself
  to specific image names. Not yet functional.

----------------------------------------------------------------------------

diff --git 
a/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp
 
b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp
index 1406d10..5a9afbb 100644
--- 
a/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp
+++ 
b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp
@@ -4,9 +4,13 @@
  */
 #include "BreakConditionConfigWindow.h"
 
+#include <Box.h>
 #include <Button.h>
 #include <CheckBox.h>
 #include <LayoutBuilder.h>
+#include <ListView.h>
+#include <MenuField.h>
+#include <ScrollView.h>
 
 #include <AutoLocker.h>
 
@@ -20,7 +24,12 @@
 
 enum {
        MSG_STOP_ON_THROWN_EXCEPTION_CHANGED    = 'stec',
-       MSG_STOP_ON_CAUGHT_EXCEPTION_CHANGED    = 'scec'
+       MSG_STOP_ON_CAUGHT_EXCEPTION_CHANGED    = 'scec',
+       MSG_SET_STOP_FOR_ALL_IMAGES                             = 'sfai',
+       MSG_SET_STOP_FOR_CUSTOM_IMAGES                  = 'sfci',
+       MSG_IMAGE_NAME_SELECTION_CHANGED                = 'insc',
+       MSG_ADD_IMAGE_NAME                                              = 
'anin',
+       MSG_REMOVE_IMAGE_NAME                                   = 'arin'
 };
 
 
@@ -33,6 +42,12 @@ 
BreakConditionConfigWindow::BreakConditionConfigWindow(::Team* team,
        fListener(listener),
        fExceptionThrown(NULL),
        fExceptionCaught(NULL),
+       fStopOnImageLoad(NULL),
+       fStopImageConstraints(NULL),
+       fStopImageNames(NULL),
+       fStopImageNameInput(NULL),
+       fAddImageNameButton(NULL),
+       fRemoveImageNameButton(NULL),
        fCloseButton(NULL),
        fTarget(target)
 {
@@ -78,6 +93,43 @@ BreakConditionConfigWindow::MessageReceived(BMessage* 
message)
                {
                        break;
                }
+
+               case MSG_SET_STOP_FOR_ALL_IMAGES:
+               {
+                       for (int32 i = 0; i < fStopImageNames->CountItems(); 
i++)
+                               fStopImageNames->ItemAt(i)->SetEnabled(false);
+                       fStopImageNameInput->SetEnabled(false);
+                       fAddImageNameButton->SetEnabled(false);
+                       fRemoveImageNameButton->SetEnabled(false);
+                       break;
+               }
+
+               case MSG_SET_STOP_FOR_CUSTOM_IMAGES:
+               {
+                       for (int32 i = 0; i < fStopImageNames->CountItems(); 
i++)
+                               fStopImageNames->ItemAt(i)->SetEnabled(true);
+                       fStopImageNameInput->SetEnabled(true);
+                       fAddImageNameButton->SetEnabled(
+                               fStopImageNameInput->TextView()->TextLength() > 
0);
+                       fRemoveImageNameButton->SetEnabled(
+                               fStopImageNames->CurrentSelection() >= 0);
+                       break;
+               }
+
+               case MSG_IMAGE_NAME_SELECTION_CHANGED:
+               {
+                       fRemoveImageNameButton->SetEnabled(
+                               fStopImageNames->CurrentSelection() >= 0);
+                       break;
+               }
+
+               case MSG_STOP_ON_IMAGE_LOAD:
+               {
+                       fListener->SetStopOnImageLoadRequested(
+                               fStopOnImageLoad->Value() == B_CONTROL_ON);
+                       break;
+               }
+
                default:
                        BWindow::MessageReceived(message);
                        break;
@@ -97,28 +149,84 @@ BreakConditionConfigWindow::Show()
 void
 BreakConditionConfigWindow::_Init()
 {
+       BBox* exceptionSettingsBox = new BBox("exceptionBox");
+       exceptionSettingsBox->SetLabel("Exceptions");
+       exceptionSettingsBox->AddChild(BLayoutBuilder::Group<>()
+               .AddGroup(B_VERTICAL)
+                       .SetInsets(B_USE_DEFAULT_SPACING)
+                       .Add(fExceptionThrown = new BCheckBox("exceptionThrown",
+                               "Stop when an exception is thrown",
+                               new 
BMessage(MSG_STOP_ON_THROWN_EXCEPTION_CHANGED)))
+                       .Add(fExceptionCaught = new BCheckBox("exceptionCaught",
+                               "Stop when an exception is caught",
+                               new 
BMessage(MSG_STOP_ON_CAUGHT_EXCEPTION_CHANGED)))
+               .End()
+               .View());
+
+       fExceptionThrown->SetTarget(this);
+       fExceptionCaught->SetTarget(this);
+
+       // TODO: enable once implemented
+       fExceptionCaught->SetEnabled(false);
+
+
+       BBox* imageSettingsBox = new BBox("imageBox");
+       imageSettingsBox->SetLabel("Images");
+       BMenu* stopImageMenu = new BMenu("stopImageTypesMenu");
+
+       stopImageMenu->AddItem(new BMenuItem("All",
+               new BMessage(MSG_SET_STOP_FOR_ALL_IMAGES)));
+       stopImageMenu->AddItem(new BMenuItem("Custom",
+               new BMessage(MSG_SET_STOP_FOR_CUSTOM_IMAGES)));
+
+       BListView* fStopImageNames = new BListView("customImageList",
+               B_MULTIPLE_SELECTION_LIST);
+       fStopImageNames->SetSelectionMessage(
+               new BMessage(MSG_IMAGE_NAME_SELECTION_CHANGED));
+
+       imageSettingsBox->AddChild(BLayoutBuilder::Group<>()
+               .AddGroup(B_VERTICAL)
+                       .SetInsets(B_USE_DEFAULT_SPACING)
+                       .Add(fStopOnImageLoad = new BCheckBox("stopOnImage",
+                               "Stop when an image is loaded",
+                               new BMessage(MSG_STOP_ON_IMAGE_LOAD)))
+                       .Add(fStopImageConstraints = new BMenuField(
+                               "stopTypes", "Types:", stopImageMenu))
+                       .Add(new BScrollView("stopImageScroll", fStopImageNames,
+                               0, false, true))
+                       .Add(fStopImageNameInput = new 
BTextControl("stopImageName",
+                               "Image:", NULL, NULL))
+                       .AddGroup(B_HORIZONTAL)
+                               .AddGlue()
+                               .Add(fAddImageNameButton = new BButton("Add",
+                                       new BMessage(MSG_ADD_IMAGE_NAME)))
+                               .Add(fRemoveImageNameButton = new 
BButton("Remove",
+                                       new BMessage(MSG_REMOVE_IMAGE_NAME)))
+                       .End()
+               .End()
+               .View());
+
+       font_height fontHeight;
+       be_plain_font->GetHeight(&fontHeight);
+       float minListHeight = 5 * (fontHeight.ascent + fontHeight.descent
+                       + fontHeight.leading);
+       fStopImageNames->SetExplicitMinSize(BSize(B_SIZE_UNSET, minListHeight));
+
        BLayoutBuilder::Group<>(this, B_VERTICAL)
                .SetInsets(B_USE_DEFAULT_SPACING)
-               .Add(fExceptionThrown = new BCheckBox("exceptionThrown",
-                       "Stop when an exception is thrown", new BMessage(
-                               MSG_STOP_ON_THROWN_EXCEPTION_CHANGED)))
-               .Add(fExceptionCaught = new BCheckBox("exceptionCaught",
-                       "Stop when an exception is caught", new BMessage(
-                               MSG_STOP_ON_CAUGHT_EXCEPTION_CHANGED)))
-               .AddGroup(B_HORIZONTAL, 4.0f)
+               .Add(exceptionSettingsBox)
+               .Add(imageSettingsBox)
+               .AddGroup(B_HORIZONTAL)
                        .AddGlue()
                        .Add(fCloseButton = new BButton("Close", new BMessage(
                                        B_QUIT_REQUESTED)))
                .End();
 
-       fExceptionThrown->SetTarget(this);
-       fExceptionCaught->SetTarget(this);
-
-       // TODO: enable once implemented
-       fExceptionCaught->SetEnabled(false);
 
        fCloseButton->SetTarget(this);
-
+       stopImageMenu->SetTargetForItems(this);
+       stopImageMenu->SetLabelFromMarked(true);
+       stopImageMenu->ItemAt(0L)->SetMarked(true);
 
        // check if the exception breakpoints are already installed
        AutoLocker< ::Team> teamLocker(fTeam);
diff --git 
a/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h 
b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h
index fc9eccd..3c51bc8 100644
--- 
a/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h
+++ 
b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h
@@ -13,6 +13,9 @@
 
 class BButton;
 class BCheckBox;
+class BListView;
+class BMenuField;
+class BTextControl;
 class ImageDebugInfo;
 class Team;
 class UserInterfaceListener;
@@ -47,6 +50,12 @@ private:
                        UserInterfaceListener* fListener;
                        BCheckBox*                      fExceptionThrown;
                        BCheckBox*                      fExceptionCaught;
+                       BCheckBox*                      fStopOnImageLoad;
+                       BMenuField*                     fStopImageConstraints;
+                       BListView*                      fStopImageNames;
+                       BTextControl*           fStopImageNameInput;
+                       BButton*                        fAddImageNameButton;
+                       BButton*                        fRemoveImageNameButton;
                        BButton*                        fCloseButton;
                        BHandler*                       fTarget;
 };

############################################################################

Commit:      cae8421db8b96d66de93ee65fa7872bbf85e689e
URL:         http://cgit.haiku-os.org/haiku/commit/?id=cae8421
Author:      Rene Gollent <anevilyak@xxxxxxxxx>
Date:        Sun Jul  7 04:31:22 2013 UTC

Implement debugger infrastructure for stop on...

...image load with name matching.

- Move the stop on image load setting to Team, along with a new setting
governing the use of the (also newly added) name list.

- Add accessors for maintaining the name list, and events/notifications
for listeners with regards to changes to all stop on image load
settings.

- Adjust user interface listener hooks for additional functionality.

----------------------------------------------------------------------------

diff --git a/src/apps/debugger/MessageCodes.h b/src/apps/debugger/MessageCodes.h
index 288eea8..e0efd00 100644
--- a/src/apps/debugger/MessageCodes.h
+++ b/src/apps/debugger/MessageCodes.h
@@ -23,12 +23,17 @@ enum {
        MSG_ENABLE_WATCHPOINT                                           = 
'ewpt',
        MSG_DISABLE_WATCHPOINT                                          = 
'dwpt',
        MSG_STOP_ON_IMAGE_LOAD                                          = 
'tsil',
+       MSG_ADD_STOP_IMAGE_NAME                                         = 
'asin',
+       MSG_REMOVE_STOP_IMAGE_NAME                                      = 
'rsin',
 
        MSG_THREAD_STATE_CHANGED                                        = 
'tsch',
        MSG_THREAD_CPU_STATE_CHANGED                            = 'tcsc',
        MSG_THREAD_STACK_TRACE_CHANGED                          = 'tstc',
        MSG_STACK_FRAME_VALUE_RETRIEVED                         = 'sfvr',
        MSG_IMAGE_DEBUG_INFO_CHANGED                            = 'idic',
+       MSG_STOP_IMAGE_SETTINGS_CHANGED                         = 'sisc',
+       MSG_STOP_IMAGE_NAME_ADDED                                       = 
'sina',
+       MSG_STOP_IMAGE_NAME_REMOVED                                     = 
'sinr',
        MSG_CONSOLE_OUTPUT_RECEIVED                                     = 
'core',
        MSG_IMAGE_FILE_CHANGED                                          = 
'ifch',
        MSG_FUNCTION_SOURCE_CODE_CHANGED                        = 'fnsc',
diff --git a/src/apps/debugger/controllers/TeamDebugger.cpp 
b/src/apps/debugger/controllers/TeamDebugger.cpp
index 449eb874..4e7b62b 100644
--- a/src/apps/debugger/controllers/TeamDebugger.cpp
+++ b/src/apps/debugger/controllers/TeamDebugger.cpp
@@ -14,6 +14,7 @@
 
 #include <Entry.h>
 #include <Message.h>
+#include <StringList.h>
 
 #include <AutoDeleter.h>
 #include <AutoLocker.h>
@@ -223,8 +224,7 @@ TeamDebugger::TeamDebugger(Listener* listener, 
UserInterface* userInterface,
        fTerminating(false),
        fKillTeamOnQuit(false),
        fCommandLineArgc(0),
-       fCommandLineArgv(NULL),
-       fStopOnImageLoad(false)
+       fCommandLineArgv(NULL)
 {
        fUserInterface->AcquireReference();
 }
@@ -608,13 +608,39 @@ TeamDebugger::MessageReceived(BMessage* message)
                case MSG_STOP_ON_IMAGE_LOAD:
                {
                        bool enabled;
+                       bool useNames;
                        if (message->FindBool("enabled", &enabled) != B_OK)
                                break;
 
-                       fStopOnImageLoad = enabled;
+                       if (message->FindBool("useNames", &useNames) != B_OK)
+                               break;
+
+                       AutoLocker< ::Team> teamLocker(fTeam);
+                       fTeam->SetStopOnImageLoad(enabled, useNames);
                        break;
                }
 
+               case MSG_ADD_STOP_IMAGE_NAME:
+               {
+                       BString imageName;
+                       if (message->FindString("name", &imageName) != B_OK)
+                               break;
+
+                       AutoLocker< ::Team> teamLocker(fTeam);
+                       fTeam->AddStopImageName(imageName);
+                       break;
+               }
+
+               case MSG_REMOVE_STOP_IMAGE_NAME:
+               {
+                       BString imageName;
+                       if (message->FindString("name", &imageName) != B_OK)
+                               break;
+
+                       AutoLocker< ::Team> teamLocker(fTeam);
+                       fTeam->RemoveStopImageName(imageName);
+               }
+
                case MSG_SET_WATCHPOINT:
                case MSG_CLEAR_WATCHPOINT:
                {
@@ -899,10 +925,29 @@ TeamDebugger::ClearBreakpointRequested(target_addr_t 
address)
 
 
 void
-TeamDebugger::SetStopOnImageLoadRequested(bool enabled)
+TeamDebugger::SetStopOnImageLoadRequested(bool enabled, bool useImageNames)
 {
        BMessage message(MSG_STOP_ON_IMAGE_LOAD);
        message.AddBool("enabled", enabled);
+       message.AddBool("useNames", useImageNames);
+       PostMessage(&message);
+}
+
+
+void
+TeamDebugger::AddStopImageNameRequested(const char* name)
+{
+       BMessage message(MSG_ADD_STOP_IMAGE_NAME);
+       message.AddString("name", name);
+       PostMessage(&message);
+}
+
+
+void
+TeamDebugger::RemoveStopImageNameRequested(const char* name)
+{
+       BMessage message(MSG_REMOVE_STOP_IMAGE_NAME);
+       message.AddString("name", name);
        PostMessage(&message);
 }
 
@@ -1525,13 +1570,30 @@ TeamDebugger::_HandleImageDebugInfoChanged(image_id 
imageID)
                if (thread != NULL) {
                        fImageInfoPendingThreads->Remove(thread);
                        ObjectDeleter<ImageInfoPendingThread> 
threadDeleter(thread);
-                       if (fStopOnImageLoad) {
+                       locker.Lock();
+                       if (fTeam->StopOnImageLoad()) {
                                ThreadHandler* handler = 
_GetThreadHandler(thread->ThreadID());
                                BReference<ThreadHandler> 
handlerReference(handler);
 
-                               if (handler != NULL && 
handler->HandleThreadDebugged(NULL))
+                               bool stop = true;
+                               if (fTeam->StopImageNameListEnabled()) {
+                                       const BStringList& nameList = 
fTeam->StopImageNames();
+                                       const BString& imageName = 
image->Name();
+                                       // only match on the image filename 
itself
+                                       const char* rawImageName = 
imageName.String()
+                                               + imageName.FindLast('/') + 1;
+                                       stop = nameList.HasString(rawImageName);
+                               }
+
+                               locker.Unlock();
+
+                               if (stop && handler != NULL
+                                       && handler->HandleThreadDebugged(NULL)) 
{
                                        return;
-                       }
+                               }
+                       } else
+                               locker.Unlock();
+
                        fDebuggerInterface->ContinueThread(thread->ThreadID());
                }
        }
diff --git a/src/apps/debugger/controllers/TeamDebugger.h 
b/src/apps/debugger/controllers/TeamDebugger.h
index b869ece..c91fc58 100644
--- a/src/apps/debugger/controllers/TeamDebugger.h
+++ b/src/apps/debugger/controllers/TeamDebugger.h
@@ -70,6 +70,7 @@ private:
                                                                        
ValueNode* valueNode);
        virtual void                            ThreadActionRequested(thread_id 
threadID,
                                                                        uint32 
action, target_addr_t address);
+
        virtual void                            
SetBreakpointRequested(target_addr_t address,
                                                                        bool 
enabled, bool hidden = false);
        virtual void                            SetBreakpointEnabledRequested(
@@ -78,7 +79,14 @@ private:
        virtual void                            
ClearBreakpointRequested(target_addr_t address);
        virtual void                            ClearBreakpointRequested(
                                                                        
UserBreakpoint* breakpoint);
-       virtual void                            
SetStopOnImageLoadRequested(bool enabled);
+
+       virtual void                            
SetStopOnImageLoadRequested(bool enabled,
+                                                                       bool 
useImageNames);
+       virtual void                            AddStopImageNameRequested(
+                                                                       const 
char* name);
+       virtual void                            RemoveStopImageNameRequested(
+                                                                       const 
char* name);
+
        virtual void                            
SetWatchpointRequested(target_addr_t address,
                                                                        uint32 
type, int32 length, bool enabled);
        virtual void                            SetWatchpointEnabledRequested(
@@ -207,7 +215,6 @@ private:
                        TeamSettings            fTeamSettings;
                        int                                     
fCommandLineArgc;
                        const char**            fCommandLineArgv;
-                       bool                            fStopOnImageLoad;
 };
 
 
diff --git a/src/apps/debugger/model/Team.cpp b/src/apps/debugger/model/Team.cpp
index 016da1c..47ca84d 100644
--- a/src/apps/debugger/model/Team.cpp
+++ b/src/apps/debugger/model/Team.cpp
@@ -7,8 +7,6 @@
 
 #include "Team.h"
 
-#include <stdio.h>
-
 #include <new>
 
 #include <AutoLocker.h>
@@ -79,7 +77,9 @@ Team::Team(team_id teamID, TeamMemory* teamMemory, 
Architecture* architecture,
        fTeamMemory(teamMemory),
        fTypeInformation(typeInformation),
        fArchitecture(architecture),
-       fDebugInfo(debugInfo)
+       fDebugInfo(debugInfo),
+       fStopOnImageLoad(false),
+       fStopImageNameListEnabled(false)
 {
        fDebugInfo->AcquireReference();
 }
@@ -275,6 +275,43 @@ Team::Images() const
 
 
 bool
+Team::AddStopImageName(const BString& name)
+{
+       if (!fStopImageNames.Add(name))
+               return false;
+
+       fStopImageNames.Sort();
+
+       NotifyStopImageNameAdded(name);
+       return true;
+}
+
+
+void
+Team::RemoveStopImageName(const BString& name)
+{
+       fStopImageNames.Remove(name);
+       NotifyStopImageNameRemoved(name);
+}
+
+
+void
+Team::SetStopOnImageLoad(bool enabled, bool useImageNameList)
+{
+       fStopOnImageLoad = enabled;
+       fStopImageNameListEnabled = useImageNameList;
+       NotifyStopOnImageLoadChanged(enabled, useImageNameList);
+}
+
+
+const BStringList&
+Team::StopImageNames() const
+{
+       return fStopImageNames;
+}
+
+
+bool
 Team::AddBreakpoint(Breakpoint* breakpoint)
 {
        if (fBreakpoints.BinaryInsert(breakpoint, 
&Breakpoint::CompareBreakpoints))
@@ -615,6 +652,41 @@ Team::NotifyImageDebugInfoChanged(Image* image)
 
 
 void
+Team::NotifyStopOnImageLoadChanged(bool enabled, bool useImageNameList)
+{
+       for (ListenerList::Iterator it = fListeners.GetIterator();
+                       Listener* listener = it.Next();) {
+               listener->StopOnImageLoadSettingsChanged(
+                       ImageLoadEvent(TEAM_EVENT_IMAGE_LOAD_SETTINGS_CHANGED, 
this,
+                               enabled, useImageNameList));
+       }
+}
+
+
+void
+Team::NotifyStopImageNameAdded(const BString& name)
+{
+       for (ListenerList::Iterator it = fListeners.GetIterator();
+                       Listener* listener = it.Next();) {
+               listener->StopOnImageLoadNameAdded(
+                       ImageLoadNameEvent(TEAM_EVENT_IMAGE_LOAD_NAME_ADDED, 
this, name));
+       }
+}
+
+
+void
+Team::NotifyStopImageNameRemoved(const BString& name)
+{
+       for (ListenerList::Iterator it = fListeners.GetIterator();
+                       Listener* listener = it.Next();) {
+               listener->StopOnImageLoadNameRemoved(
+                       ImageLoadNameEvent(TEAM_EVENT_IMAGE_LOAD_NAME_REMOVED, 
this,
+                               name));
+       }
+}
+
+
+void
 Team::NotifyConsoleOutputReceived(int32 fd, const BString& output)
 {
        for (ListenerList::Iterator it = fListeners.GetIterator();
@@ -732,6 +804,31 @@ Team::ImageEvent::ImageEvent(uint32 type, Image* image)
 }
 
 
+// #pragma mark - ImageLoadEvent
+
+
+Team::ImageLoadEvent::ImageLoadEvent(uint32 type, Team* team,
+       bool stopOnImageLoad, bool stopImageNameListEnabled)
+       :
+       Event(type, team),
+       fStopOnImageLoad(stopOnImageLoad),
+       fStopImageNameListEnabled(stopImageNameListEnabled)
+{
+}
+
+
+// #pragma mark - ImageLoadNameEvent
+
+
+Team::ImageLoadNameEvent::ImageLoadNameEvent(uint32 type, Team* team,
+       const BString& name)
+       :
+       Event(type, team),
+       fImageName(name)
+{
+}
+
+
 // #pragma mark - BreakpointEvent
 
 
@@ -850,6 +947,26 @@ Team::Listener::ImageDebugInfoChanged(const 
Team::ImageEvent& event)
 
 
 void
+Team::Listener::StopOnImageLoadSettingsChanged(
+       const Team::ImageLoadEvent& event)
+{
+}
+
+
+void
+Team::Listener::StopOnImageLoadNameAdded(const Team::ImageLoadNameEvent& event)
+{
+}
+
+
+void
+Team::Listener::StopOnImageLoadNameRemoved(
+       const Team::ImageLoadNameEvent& event)
+{
+}
+
+
+void
 Team::Listener::ConsoleOutputReceived(const Team::ConsoleOutputEvent& event)
 {
 }
diff --git a/src/apps/debugger/model/Team.h b/src/apps/debugger/model/Team.h
index 98a2fb2..5428084 100644
--- a/src/apps/debugger/model/Team.h
+++ b/src/apps/debugger/model/Team.h
@@ -8,6 +8,7 @@
 
 
 #include <Locker.h>
+#include <StringList.h>
 
 #include <ObjectList.h>
 
@@ -33,6 +34,10 @@ enum {
 
        TEAM_EVENT_IMAGE_DEBUG_INFO_CHANGED,
 
+       TEAM_EVENT_IMAGE_LOAD_SETTINGS_CHANGED,
+       TEAM_EVENT_IMAGE_LOAD_NAME_ADDED,
+       TEAM_EVENT_IMAGE_LOAD_NAME_REMOVED,
+
        TEAM_EVENT_CONSOLE_OUTPUT_RECEIVED,
 
        TEAM_EVENT_BREAKPOINT_ADDED,
@@ -50,6 +55,7 @@ enum {
 
 class Architecture;
 class Breakpoint;
+class BStringList;
 class Function;
 class FunctionID;
 class FunctionInstance;
@@ -70,6 +76,8 @@ public:
                        class ConsoleOutputEvent;
                        class DebugReportEvent;
                        class ImageEvent;
+                       class ImageLoadEvent;
+                       class ImageLoadNameEvent;
                        class ThreadEvent;
                        class UserBreakpointEvent;
                        class WatchpointEvent;
@@ -117,6 +125,17 @@ public:
                        Image*                          
ImageByAddress(target_addr_t address) const;
                        const ImageList&        Images() const;
 
+                       bool                            AddStopImageName(const 
BString& name);
+                       void                            
RemoveStopImageName(const BString& name);
+                       const BStringList&      StopImageNames() const;
+
+                       void                            SetStopOnImageLoad(bool 
enabled,
+                                                                       bool 
useImageNameList);
+                       bool                            StopOnImageLoad() const
+                                                                       { 
return fStopOnImageLoad; }
+                       bool                            
StopImageNameListEnabled() const
+                                                                       { 
return fStopImageNameListEnabled; }
+
                        bool                            
AddBreakpoint(Breakpoint* breakpoint);
                                                                        // 
takes over reference (also on error)
                        void                            
RemoveBreakpoint(Breakpoint* breakpoint);
@@ -183,6 +202,13 @@ public:
                        // service methods for Image
                        void                            
NotifyImageDebugInfoChanged(Image* image);
 
+                       // service methods for Image load settings
+                       void                            
NotifyStopOnImageLoadChanged(bool enabled,
+                                                                       bool 
useImageNameList);
+                       void                            
NotifyStopImageNameAdded(const BString& name);
+                       void                            
NotifyStopImageNameRemoved(
+                                                                       const 
BString& name);
+
                        // service methods for console output
                        void                            
NotifyConsoleOutputReceived(
                                                                        int32 
fd, const BString& output);
@@ -223,6 +249,9 @@ private:
                        BString                         fName;
                        ThreadList                      fThreads;
                        ImageList                       fImages;
+                       bool                            fStopOnImageLoad;
+                       bool                            
fStopImageNameListEnabled;
+                       BStringList                     fStopImageNames;
                        BreakpointList          fBreakpoints;
                        WatchpointList          fWatchpoints;
                        UserBreakpointList      fUserBreakpoints;
@@ -265,6 +294,35 @@ protected:
 };
 
 
+class Team::ImageLoadEvent : public Event {
+public:
+                                                               
ImageLoadEvent(uint32 type, Team* team,
+                                                                       bool 
stopOnImageLoad,
+                                                                       bool 
stopImageNameListEnabled);
+
+                       bool                            StopOnImageLoad() const
+                                                                       { 
return fStopOnImageLoad; }
+                       bool                            
StopImageNameListEnabled() const
+                                                                       { 
return fStopImageNameListEnabled; }
+
+private:
+                       bool                            fStopOnImageLoad;
+                       bool                            
fStopImageNameListEnabled;
+};
+
+
+class Team::ImageLoadNameEvent : public Event {
+public:
+                                                               
ImageLoadNameEvent(uint32 type, Team* team,
+                                                                       const 
BString& name);
+
+                       const BString&          ImageName() const { return 
fImageName; }
+
+private:
+                       BString                         fImageName;
+};
+
+
 class Team::BreakpointEvent : public Event {
 public:
                                                                
BreakpointEvent(uint32 type, Team* team,
@@ -346,6 +404,13 @@ public:
        virtual void                            ImageDebugInfoChanged(
                                                                        const 
Team::ImageEvent& event);
 
+       virtual void                            StopOnImageLoadSettingsChanged(
+                                                                       const 
Team::ImageLoadEvent& event);
+       virtual void                            StopOnImageLoadNameAdded(
+                                                                       const 
Team::ImageLoadNameEvent& event);
+       virtual void                            StopOnImageLoadNameRemoved(
+                                                                       const 
Team::ImageLoadNameEvent& event);
+
        virtual void                            ConsoleOutputReceived(
                                                                        const 
Team::ConsoleOutputEvent& event);
 
diff --git a/src/apps/debugger/user_interface/UserInterface.h 
b/src/apps/debugger/user_interface/UserInterface.h
index 5473156..cb00459 100644
--- a/src/apps/debugger/user_interface/UserInterface.h
+++ b/src/apps/debugger/user_interface/UserInterface.h
@@ -106,7 +106,12 @@ public:
                                                                        
UserBreakpoint* breakpoint) = 0;
                                                                        // 
TODO: Consolidate those!
 
-       virtual void                            
SetStopOnImageLoadRequested(bool enabled) = 0;
+       virtual void                            
SetStopOnImageLoadRequested(bool enabled,
+                                                                       bool 
useImageNames) = 0;
+       virtual void                            AddStopImageNameRequested(
+                                                                       const 
char* name) = 0;
+       virtual void                            RemoveStopImageNameRequested(
+                                                                       const 
char* name) = 0;
 
        virtual void                            
SetWatchpointRequested(target_addr_t address,
                                                                        uint32 
type, int32 length,

############################################################################

Revision:    hrev45831
Commit:      9a14c8a25d0830ca07334ad3339d3f3b1bb588e3
URL:         http://cgit.haiku-os.org/haiku/commit/?id=9a14c8a
Author:      Rene Gollent <anevilyak@xxxxxxxxx>
Date:        Sun Jul  7 04:34:12 2013 UTC

Implement configuration for stop on image load with names.

- BreakConditionConfigWindow is now a team listener so it can watch for
the appropriate events.
- Implement reading/maintaining state in response to the various
notifications.
- Implement adding/removing names and enabling/disabling the use of the
name list.

----------------------------------------------------------------------------

diff --git 
a/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp
 
b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp
index 5a9afbb..a6428f2 100644
--- 
a/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp
+++ 
b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp
@@ -12,6 +12,7 @@
 #include <MenuField.h>
 #include <ScrollView.h>
 
+#include <AutoDeleter.h>
 #include <AutoLocker.h>
 
 #include "FunctionInstance.h"
@@ -33,6 +34,22 @@ enum {
 };
 
 
+static int SortStringItems(const void* a, const void* b)
+{
+       BStringItem* item1 = *(BStringItem**)a;
+       BStringItem* item2 = *(BStringItem**)b;
+
+       return strcmp(item1->Text(), item2->Text());
+}
+
+
+static bool UpdateItemState(BListItem* item, void* enabled)
+{
+       item->SetEnabled((bool)enabled);
+       return false;
+}
+
+
 BreakConditionConfigWindow::BreakConditionConfigWindow(::Team* team,
        UserInterfaceListener* listener, BHandler* target)
        :
@@ -48,14 +65,17 @@ 
BreakConditionConfigWindow::BreakConditionConfigWindow(::Team* team,
        fStopImageNameInput(NULL),
        fAddImageNameButton(NULL),
        fRemoveImageNameButton(NULL),
+       fUseCustomImages(false),
        fCloseButton(NULL),
        fTarget(target)
 {
+       fTeam->AddListener(this);
 }
 
 
 BreakConditionConfigWindow::~BreakConditionConfigWindow()
 {
+       fTeam->RemoveListener(this);
        
BMessenger(fTarget).SendMessage(MSG_BREAK_CONDITION_CONFIG_WINDOW_CLOSED);
 }
 
@@ -96,28 +116,27 @@ BreakConditionConfigWindow::MessageReceived(BMessage* 
message)
 
                case MSG_SET_STOP_FOR_ALL_IMAGES:
                {
-                       for (int32 i = 0; i < fStopImageNames->CountItems(); 
i++)
-                               fStopImageNames->ItemAt(i)->SetEnabled(false);
-                       fStopImageNameInput->SetEnabled(false);
-                       fAddImageNameButton->SetEnabled(false);
-                       fRemoveImageNameButton->SetEnabled(false);
+                       fUseCustomImages = false;
+                       fListener->SetStopOnImageLoadRequested(
+                               fStopOnImageLoad->Value() == B_CONTROL_ON,
+                               fUseCustomImages);
                        break;
                }
 
                case MSG_SET_STOP_FOR_CUSTOM_IMAGES:
                {
-                       for (int32 i = 0; i < fStopImageNames->CountItems(); 
i++)
-                               fStopImageNames->ItemAt(i)->SetEnabled(true);
-                       fStopImageNameInput->SetEnabled(true);
-                       fAddImageNameButton->SetEnabled(
-                               fStopImageNameInput->TextView()->TextLength() > 
0);
-                       fRemoveImageNameButton->SetEnabled(
-                               fStopImageNames->CurrentSelection() >= 0);
+                       fUseCustomImages = true;
+                       fListener->SetStopOnImageLoadRequested(
+                               fStopOnImageLoad->Value() == B_CONTROL_ON,
+                               fUseCustomImages);
                        break;
                }
 
                case MSG_IMAGE_NAME_SELECTION_CHANGED:
                {
+                       if (!fUseCustomImages)
+                               break;
+
                        fRemoveImageNameButton->SetEnabled(
                                fStopImageNames->CurrentSelection() >= 0);
                        break;
@@ -126,10 +145,79 @@ BreakConditionConfigWindow::MessageReceived(BMessage* 
message)
                case MSG_STOP_ON_IMAGE_LOAD:
                {
                        fListener->SetStopOnImageLoadRequested(
-                               fStopOnImageLoad->Value() == B_CONTROL_ON);
+                               fStopOnImageLoad->Value() == B_CONTROL_ON,
+                               fUseCustomImages);
+                       break;
+               }
+
+               case MSG_STOP_IMAGE_SETTINGS_CHANGED:
+               {
+                       _UpdateStopImageButtons();
+                       break;
+               }
+
+               case MSG_ADD_IMAGE_NAME:
+               {
+                       BString imageName(fStopImageNameInput->Text());
+                       AutoLocker< ::Team> teamLocker(fTeam);
+                       if (fTeam->StopImageNames().HasString(imageName))
+                               break;
+
+                       fStopImageNameInput->SetText("");
+                       
fListener->AddStopImageNameRequested(imageName.String());
                        break;
                }
 
+               case MSG_STOP_IMAGE_NAME_ADDED:
+               {
+                       const char* imageName;
+                       if (message->FindString("name", &imageName) != B_OK)
+                               break;
+
+                       BStringItem* item = new(std::nothrow) 
BStringItem(imageName);
+                       if (item == NULL)
+                               break;
+
+                       ObjectDeleter<BStringItem> itemDeleter(item);
+                       if (!fStopImageNames->AddItem(item)) {
+                               break;
+                       }
+                       itemDeleter.Detach();
+                       fStopImageNames->SortItems(SortStringItems);
+                       break;
+               }
+
+               case MSG_REMOVE_IMAGE_NAME:
+               {
+                       BStringItem* item;
+                       int32 selectedIndex;
+                       AutoLocker< ::Team> teamLocker(fTeam);
+                       int32 i = 0;
+                       while ((selectedIndex = 
fStopImageNames->CurrentSelection(i++))
+                               >= 0) {
+                               item = 
(BStringItem*)fStopImageNames->ItemAt(selectedIndex);
+                               
fListener->RemoveStopImageNameRequested(item->Text());
+                       }
+                       break;
+               }
+
+               case MSG_STOP_IMAGE_NAME_REMOVED:
+               {
+                       const char* imageName;
+                       if (message->FindString("name", &imageName) != B_OK)
+                               break;
+
+                       for (int32 i = 0; i < fStopImageNames->CountItems(); 
i++) {
+                               BStringItem* item = 
(BStringItem*)fStopImageNames->ItemAt(i);
+                               if (strcmp(item->Text(), imageName) == 0) {
+                                       fStopImageNames->RemoveItem(i);
+                                       delete item;
+                               }
+                       }
+                       break;
+               }
+
+
                default:
                        BWindow::MessageReceived(message);
                        break;
@@ -147,6 +235,37 @@ BreakConditionConfigWindow::Show()
 
 
 void
+BreakConditionConfigWindow::StopOnImageLoadSettingsChanged(
+       const Team::ImageLoadEvent& event)
+{
+       BMessage message(MSG_STOP_IMAGE_SETTINGS_CHANGED);
+       message.AddBool("enabled", event.StopOnImageLoad());
+       message.AddBool("useNameList", event.StopImageNameListEnabled());
+       PostMessage(&message);
+}
+
+
+void
+BreakConditionConfigWindow::StopOnImageLoadNameAdded(
+       const Team::ImageLoadNameEvent& event)
+{
+       BMessage message(MSG_STOP_IMAGE_NAME_ADDED);
+       message.AddString("name", event.ImageName());
+       PostMessage(&message);
+}
+
+
+void
+BreakConditionConfigWindow::StopOnImageLoadNameRemoved(
+       const Team::ImageLoadNameEvent& event)
+{
+       BMessage message(MSG_STOP_IMAGE_NAME_REMOVED);
+       message.AddString("name", event.ImageName());
+       PostMessage(&message);
+}
+
+
+void
 BreakConditionConfigWindow::_Init()
 {
        BBox* exceptionSettingsBox = new BBox("exceptionBox");
@@ -179,7 +298,7 @@ BreakConditionConfigWindow::_Init()
        stopImageMenu->AddItem(new BMenuItem("Custom",
                new BMessage(MSG_SET_STOP_FOR_CUSTOM_IMAGES)));
 
-       BListView* fStopImageNames = new BListView("customImageList",
+       fStopImageNames = new BListView("customImageList",
                B_MULTIPLE_SELECTION_LIST);
        fStopImageNames->SetSelectionMessage(
                new BMessage(MSG_IMAGE_NAME_SELECTION_CHANGED));
@@ -226,24 +345,11 @@ BreakConditionConfigWindow::_Init()
        fCloseButton->SetTarget(this);
        stopImageMenu->SetTargetForItems(this);
        stopImageMenu->SetLabelFromMarked(true);
-       stopImageMenu->ItemAt(0L)->SetMarked(true);
 
-       // check if the exception breakpoints are already installed
        AutoLocker< ::Team> teamLocker(fTeam);
-       for (ImageList::ConstIterator it = fTeam->Images().GetIterator();
-               it.HasNext();) {
-               Image* image = it.Next();
+       _UpdateStopImageState();
+       _UpdateExceptionState();
 
-               ImageDebugInfo* info = image->GetImageDebugInfo();
-               target_addr_t address;
-               if (_FindExceptionFunction(info, address) != B_OK)
-                       continue;
-
-               if (fTeam->BreakpointAtAddress(address) != NULL) {
-                       fExceptionThrown->SetValue(B_CONTROL_ON);
-                       break;
-               }
-       }
 }
 
 
@@ -286,3 +392,64 @@ 
BreakConditionConfigWindow::_FindExceptionFunction(ImageDebugInfo* info,
 
        return B_NAME_NOT_FOUND;
 }
+
+
+void
+BreakConditionConfigWindow::_UpdateExceptionState()
+{
+       // check if the exception breakpoints are already installed
+       for (ImageList::ConstIterator it = fTeam->Images().GetIterator();
+               it.HasNext();) {
+               Image* image = it.Next();
+
+               ImageDebugInfo* info = image->GetImageDebugInfo();
+               target_addr_t address;
+               if (_FindExceptionFunction(info, address) != B_OK)
+                       continue;
+
+               if (fTeam->BreakpointAtAddress(address) != NULL) {
+                       fExceptionThrown->SetValue(B_CONTROL_ON);
+                       break;
+               }
+       }
+}
+
+
+void
+BreakConditionConfigWindow::_UpdateStopImageState()
+{
+       fUseCustomImages = fTeam->StopImageNameListEnabled();
+       fStopImageConstraints->Menu()->ItemAt(0)->SetMarked(!fUseCustomImages);
+       fStopImageConstraints->Menu()->ItemAt(1)->SetMarked(fUseCustomImages);
+
+       fStopImageNames->MakeEmpty();
+       const BStringList& imageNames = fTeam->StopImageNames();
+       for (int32 i = 0; i < imageNames.CountStrings(); i++) {
+               BStringItem* item = new(std::nothrow) BStringItem(
+                       imageNames.StringAt(i));
+               if (item == NULL)
+                       return;
+               item->SetEnabled(fUseCustomImages);
+               ObjectDeleter<BStringItem> itemDeleter(item);
+               if (!fStopImageNames->AddItem(item))
+                       return;
+               itemDeleter.Detach();
+       }
+
+       _UpdateStopImageButtons();
+}
+
+
+void
+BreakConditionConfigWindow::_UpdateStopImageButtons()
+{
+       bool stopOnImageLoad = fTeam->StopOnImageLoad();
+       fStopOnImageLoad->SetValue(stopOnImageLoad ? B_CONTROL_ON : 
B_CONTROL_OFF);
+       bool enabled = stopOnImageLoad && fUseCustomImages;
+       fStopImageConstraints->SetEnabled(stopOnImageLoad);
+       fAddImageNameButton->SetEnabled(enabled);
+       fRemoveImageNameButton->SetEnabled(enabled
+               && fStopImageNames->CurrentSelection() >= 0);
+       fStopImageNames->DoForEach(UpdateItemState, (void*)enabled);
+       fStopImageNameInput->TextView()->MakeEditable(enabled);
+}
diff --git 
a/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h 
b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h
index 3c51bc8..e147893 100644
--- 
a/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h
+++ 
b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h
@@ -8,6 +8,8 @@
 
 #include <Window.h>
 
+#include "Team.h"
+
 #include "types/Types.h"
 
 
@@ -17,11 +19,10 @@ class BListView;
 class BMenuField;
 class BTextControl;
 class ImageDebugInfo;
-class Team;
 class UserInterfaceListener;
 
 
-class BreakConditionConfigWindow : public BWindow {
+class BreakConditionConfigWindow : public BWindow, private Team::Listener {
 public:
                                                                
BreakConditionConfigWindow(::Team* team,
                                                                        
UserInterfaceListener* listener,
@@ -38,12 +39,27 @@ public:
 
        virtual void                            Show();
 
+       // Team::Listener
+       virtual void                            StopOnImageLoadSettingsChanged(
+                                                                       const 
Team::ImageLoadEvent& event);
+       virtual void                            StopOnImageLoadNameAdded(
+                                                                       const 
Team::ImageLoadNameEvent& event);
+       virtual void                            StopOnImageLoadNameRemoved(
+                                                                       const 
Team::ImageLoadNameEvent& event);
+
+
 private:
                        void                            _Init();
                        void                            
_UpdateThrownBreakpoints(bool enable);
                        status_t                        
_FindExceptionFunction(ImageDebugInfo* info,
                                                                        
target_addr_t& _foundAddress) const;
 
+                       void                            _UpdateExceptionState();
+                       void                            _UpdateStopImageState();
+                       void                            
_UpdateStopImageButtons();
+                                                                       // must 
be called with team lock held
+
+
 
 private:
                        ::Team*                         fTeam;
@@ -56,6 +72,7 @@ private:
                        BTextControl*           fStopImageNameInput;
                        BButton*                        fAddImageNameButton;
                        BButton*                        fRemoveImageNameButton;
+                       bool                            fUseCustomImages;
                        BButton*                        fCloseButton;
                        BHandler*                       fTarget;
 };


Other related posts:

  • » [haiku-commits] haiku: hrev45831 - in src/apps/debugger: user_interface/gui/team_window model controllers - anevilyak