xref: /haiku/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.cpp (revision fccd8899fcb583bfb73c5c26c9fcd714b963959b)
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