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