1 /* 2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7 #include "BreakpointsView.h" 8 9 #include <new> 10 11 #include <Button.h> 12 #include <LayoutBuilder.h> 13 14 #include <AutoLocker.h> 15 #include <ObjectList.h> 16 17 #include "MessageCodes.h" 18 #include "Team.h" 19 #include "UserBreakpoint.h" 20 21 22 // #pragma mark - BreakpointsView 23 24 25 BreakpointsView::BreakpointsView(Team* team, Listener* listener) 26 : 27 BGroupView(B_HORIZONTAL, 4.0f), 28 fTeam(team), 29 fBreakpoint(NULL), 30 fListView(NULL), 31 fToggleBreakpointButton(NULL), 32 fRemoveBreakpointButton(NULL), 33 fListener(listener) 34 { 35 SetName("Breakpoints"); 36 } 37 38 39 BreakpointsView::~BreakpointsView() 40 { 41 if (fListView != NULL) 42 fListView->UnsetListener(); 43 } 44 45 46 /*static*/ BreakpointsView* 47 BreakpointsView::Create(Team* team, Listener* listener) 48 { 49 BreakpointsView* self = new BreakpointsView(team, listener); 50 51 try { 52 self->_Init(); 53 } catch (...) { 54 delete self; 55 throw; 56 } 57 58 return self; 59 } 60 61 62 void 63 BreakpointsView::UnsetListener() 64 { 65 fListener = NULL; 66 } 67 68 69 void 70 BreakpointsView::SetBreakpoint(UserBreakpoint* breakpoint) 71 { 72 if (breakpoint == fBreakpoint) 73 return; 74 75 if (fBreakpoint != NULL) 76 fBreakpoint->ReleaseReference(); 77 78 fBreakpoint = breakpoint; 79 80 if (fBreakpoint != NULL) 81 fBreakpoint->AcquireReference(); 82 83 fListView->SetBreakpoint(breakpoint); 84 85 _UpdateButtons(); 86 } 87 88 89 void 90 BreakpointsView::UserBreakpointChanged(UserBreakpoint* breakpoint) 91 { 92 fListView->UserBreakpointChanged(breakpoint); 93 94 _UpdateButtons(); 95 } 96 97 98 void 99 BreakpointsView::MessageReceived(BMessage* message) 100 { 101 switch (message->what) { 102 case MSG_ENABLE_BREAKPOINT: 103 if (fListener != NULL && fBreakpoint != NULL) 104 fListener->SetBreakpointEnabledRequested(fBreakpoint, true); 105 break; 106 case MSG_DISABLE_BREAKPOINT: 107 if (fListener != NULL && fBreakpoint != NULL) 108 fListener->SetBreakpointEnabledRequested(fBreakpoint, false); 109 break; 110 case MSG_CLEAR_BREAKPOINT: 111 if (fListener != NULL && fBreakpoint != NULL) 112 fListener->ClearBreakpointRequested(fBreakpoint); 113 break; 114 default: 115 BGroupView::MessageReceived(message); 116 break; 117 } 118 } 119 120 121 void 122 BreakpointsView::AttachedToWindow() 123 { 124 fToggleBreakpointButton->SetTarget(this); 125 fRemoveBreakpointButton->SetTarget(this); 126 } 127 128 129 void 130 BreakpointsView::BreakpointSelectionChanged(UserBreakpoint* breakpoint) 131 { 132 if (fListener != NULL) 133 fListener->BreakpointSelectionChanged(breakpoint); 134 } 135 136 137 void 138 BreakpointsView::_Init() 139 { 140 BLayoutBuilder::Group<>(this) 141 .Add(fListView = BreakpointListView::Create(fTeam, this)) 142 .AddGroup(B_VERTICAL, 4.0f) 143 .Add(fToggleBreakpointButton = new BButton("Toggle")) 144 .Add(fRemoveBreakpointButton = new BButton("Remove")) 145 .AddGlue() 146 .End(); 147 148 fToggleBreakpointButton->SetMessage(new BMessage(MSG_ENABLE_BREAKPOINT)); 149 fRemoveBreakpointButton->SetMessage(new BMessage(MSG_CLEAR_BREAKPOINT)); 150 151 _UpdateButtons(); 152 } 153 154 155 void 156 BreakpointsView::_UpdateButtons() 157 { 158 AutoLocker<Team> teamLocker(fTeam); 159 160 if (fBreakpoint != NULL && fBreakpoint->IsValid()) { 161 if (fBreakpoint->IsEnabled()) { 162 fToggleBreakpointButton->SetLabel("Disable"); 163 fToggleBreakpointButton->SetMessage( 164 new BMessage(MSG_DISABLE_BREAKPOINT)); 165 } else { 166 fToggleBreakpointButton->SetLabel("Enable"); 167 fToggleBreakpointButton->SetMessage( 168 new BMessage(MSG_ENABLE_BREAKPOINT)); 169 } 170 171 fToggleBreakpointButton->SetEnabled(true); 172 fRemoveBreakpointButton->SetEnabled(true); 173 } else { 174 fToggleBreakpointButton->SetLabel("Enable"); 175 fToggleBreakpointButton->SetEnabled(false); 176 fRemoveBreakpointButton->SetEnabled(false); 177 } 178 } 179 180 181 // #pragma mark - Listener 182 183 184 BreakpointsView::Listener::~Listener() 185 { 186 } 187