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