Debugger: MarkerView tweaks.

- Draw conditional breakpoints in a different color from regular
  ones for easy visual differentiation.
- Right clicking on an existing breakpoint marker now brings up the
  condition editing window.
This commit is contained in:
Rene Gollent
2014-10-30 20:59:52 -04:00
parent fe47f15fb4
commit b13d824927
@@ -1,6 +1,6 @@
/*
* Copyright 2009-2012, Ingo Weinhold, [email protected].
* Copyright 2009-2013, Rene Gollent, [email protected].
* Copyright 2009-2014, Rene Gollent, [email protected].
* Distributed under the terms of the MIT License.
*/
@@ -223,16 +223,23 @@ private:
struct SourceView::MarkerManager::BreakpointMarker : Marker {
BreakpointMarker(uint32 line,
target_addr_t address, bool enabled);
target_addr_t address,
UserBreakpoint* breakpoint);
~BreakpointMarker();
target_addr_t Address() const { return fAddress; }
bool IsEnabled() const { return fEnabled; }
bool IsEnabled() const
{ return fBreakpoint->IsEnabled(); }
bool HasCondition() const
{ return fBreakpoint->HasCondition(); }
UserBreakpoint* Breakpoint() const
{ return fBreakpoint; }
virtual void Draw(BView* view, BRect rect);
private:
target_addr_t fAddress;
bool fEnabled;
UserBreakpoint* fBreakpoint;
};
@@ -527,12 +534,19 @@ SourceView::MarkerManager::InstructionPointerMarker::_DrawArrow(BView* view,
SourceView::MarkerManager::BreakpointMarker::BreakpointMarker(uint32 line,
target_addr_t address, bool enabled)
target_addr_t address, UserBreakpoint* breakpoint)
:
Marker(line),
fAddress(address),
fEnabled(enabled)
fBreakpoint(breakpoint)
{
fBreakpoint->AcquireReference();
}
SourceView::MarkerManager::BreakpointMarker::~BreakpointMarker()
{
fBreakpoint->ReleaseReference();
}
@@ -540,8 +554,12 @@ void
SourceView::MarkerManager::BreakpointMarker::Draw(BView* view, BRect rect)
{
float y = (rect.top + rect.bottom) / 2;
view->SetHighColor((rgb_color){255, 0, 0, 255});
if (fEnabled)
if (fBreakpoint->HasCondition())
view->SetHighColor((rgb_color){0, 192, 0, 255});
else
view->SetHighColor((rgb_color){255,0,0,255});
if (fBreakpoint->IsEnabled())
view->FillEllipse(BPoint(rect.right - 8, y), 4, 4);
else
view->StrokeEllipse(BPoint(rect.right - 8, y), 3.5f, 3.5f);
@@ -716,7 +734,7 @@ SourceView::MarkerManager::_UpdateBreakpointMarkers()
}
BreakpointMarker* marker = new(std::nothrow) BreakpointMarker(
line, breakpointInstance->Address(), breakpoint->IsEnabled());
line, breakpointInstance->Address(), breakpoint);
if (marker == NULL || !fBreakpointMarkers.AddItem(marker)) {
delete marker;
break;
@@ -963,24 +981,35 @@ SourceView::MarkerView::MouseDown(BPoint where)
BReference<Statement> statementReference(statement, true);
int32 modifiers;
if (Looper()->CurrentMessage()->FindInt32("modifiers", &modifiers) != B_OK)
int32 buttons;
BMessage* message = Looper()->CurrentMessage();
if (message->FindInt32("modifiers", &modifiers) != B_OK)
modifiers = 0;
if (message->FindInt32("buttons", &buttons) != B_OK)
buttons = B_PRIMARY_MOUSE_BUTTON;
SourceView::MarkerManager::BreakpointMarker* marker =
fMarkerManager->BreakpointMarkerAtLine(line);
target_addr_t address = marker != NULL
? marker->Address() : statement->CoveringAddressRange().Start();
if ((modifiers & B_SHIFT_KEY) != 0) {
if (marker != NULL && !marker->IsEnabled())
fListener->ClearBreakpointRequested(address);
else
fListener->SetBreakpointRequested(address, false);
} else {
if (marker != NULL && marker->IsEnabled())
fListener->ClearBreakpointRequested(address);
else
fListener->SetBreakpointRequested(address, true);
if ((buttons & B_PRIMARY_MOUSE_BUTTON) != 0) {
if ((modifiers & B_SHIFT_KEY) != 0) {
if (marker != NULL && !marker->IsEnabled())
fListener->ClearBreakpointRequested(address);
else
fListener->SetBreakpointRequested(address, false);
} else {
if (marker != NULL && marker->IsEnabled())
fListener->ClearBreakpointRequested(address);
else
fListener->SetBreakpointRequested(address, true);
}
} else if (marker != NULL && (buttons & B_SECONDARY_MOUSE_BUTTON) != 0) {
UserBreakpoint* breakpoint = marker->Breakpoint();
BMessage message(MSG_SHOW_BREAKPOINT_EDIT_WINDOW);
message.AddPointer("breakpoint", breakpoint);
Looper()->PostMessage(&message);
}
}