From f4ba9a458fb9e33bb43fc02254ca05d388aef087 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sun, 19 Jun 2011 17:21:28 +0000 Subject: [PATCH] * Cleanups. * Add support for keyboard navigation to the memory view. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42246 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../gui/inspector_window/InspectorWindow.cpp | 15 +- .../gui/inspector_window/MemoryView.cpp | 243 +++++++++++++----- .../gui/inspector_window/MemoryView.h | 19 +- 3 files changed, 185 insertions(+), 92 deletions(-) diff --git a/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp b/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp index 410a51de33..572cafcb57 100644 --- a/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp +++ b/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp @@ -147,17 +147,10 @@ InspectorWindow::_Init() fEndianMode->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); fTextMode->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); - Architecture* architecture = fTeam->GetArchitecture(); - int32 hostEndian; - int32 targetEndian; - targetEndian = architecture->IsBigEndian() ? EndianModeBigEndian - : EndianModeLittleEndian; - hostEndian = architecture->IsHostEndian() ? targetEndian - : architecture->IsBigEndian() ? EndianModeLittleEndian - : EndianModeBigEndian; + int32 targetEndian = fTeam->GetArchitecture()->IsBigEndian() + ? EndianModeBigEndian : EndianModeLittleEndian; - scrollView->SetTarget(fMemoryView = MemoryView::Create(hostEndian, - targetEndian)); + scrollView->SetTarget(fMemoryView = MemoryView::Create(fTeam)); fAddressInput->SetTarget(this); fPreviousBlockButton->SetTarget(this); @@ -176,7 +169,7 @@ InspectorWindow::_Init() hexMenu->ItemAt(1)->SetMarked(true); textMenu->ItemAt(1)->SetMarked(true); - if (architecture->IsBigEndian()) + if (targetEndian == EndianModeBigEndian) endianMenu->ItemAt(1)->SetMarked(true); else endianMenu->ItemAt(0)->SetMarked(true); diff --git a/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.cpp b/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.cpp index 598fc4895b..cee4976320 100644 --- a/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.cpp +++ b/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.cpp @@ -11,10 +11,13 @@ #include #include +#include #include #include #include +#include "Architecture.h" +#include "Team.h" #include "TeamMemoryBlock.h" @@ -23,18 +26,19 @@ enum { }; -MemoryView::MemoryView(int32 hostEndianMode, int32 targetEndianMode) +MemoryView::MemoryView(::Team* team) : - BView("memoryView", B_WILL_DRAW | B_FRAME_EVENTS | B_SUBPIXEL_PRECISE), + BView("memoryView", B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE + | B_SUBPIXEL_PRECISE), + fTeam(team), fTargetBlock(NULL), fTargetAddress(0LL), fCharWidth(0.0), fLineHeight(0.0), fTextCharsPerLine(0), fHexBlocksPerLine(0), - fCurrentEndianMode(hostEndianMode), - fHostEndianMode(hostEndianMode), - fTargetEndianMode(targetEndianMode), + fCurrentEndianMode(team->GetArchitecture()->IsBigEndian() + ? EndianModeBigEndian : EndianModeLittleEndian), fHexMode(HexMode8BitInt), fTextMode(TextModeASCII) { @@ -49,9 +53,9 @@ MemoryView::~MemoryView() /*static */ MemoryView* -MemoryView::Create(int32 hostEndianMode, int32 targetEndianMode) +MemoryView::Create(::Team* team) { - MemoryView* self = new MemoryView(hostEndianMode, targetEndianMode); + MemoryView* self = new MemoryView(team); try { self->_Init(); @@ -73,35 +77,11 @@ MemoryView::SetTargetAddress(TeamMemoryBlock* block, target_addr_t address) fTargetBlock = block; fTargetBlock->AcquireReference(); + MakeFocus(true); BMessenger(this).SendMessage(MSG_TARGET_ADDRESS_CHANGED); } -void -MemoryView::ScrollToSelection() -{ - if (fTargetBlock != NULL) { - target_addr_t offset = fTargetAddress - fTargetBlock->BaseAddress(); - int32 lineNumber = 0; - if (fHexBlocksPerLine > 0) - lineNumber = offset / (fHexBlocksPerLine * (1 << (fHexMode - 1))); - else if (fTextCharsPerLine > 0) - lineNumber = offset / fTextCharsPerLine; - float y = lineNumber * fLineHeight; - if (!Bounds().Contains(BPoint(0.0, y))) - ScrollTo(0.0, y); - } -} - - -void -MemoryView::TargetedByScrollView(BScrollView* scrollView) -{ - BView::TargetedByScrollView(scrollView); - scrollView->ScrollBar(B_VERTICAL)->SetRange(0.0, 0.0); -} - - void MemoryView::AttachedToWindow() { @@ -247,6 +227,96 @@ MemoryView::FrameResized(float width, float height) } +void +MemoryView::KeyDown(const char* bytes, int32 numBytes) +{ + bool handled = true; + if (fTargetBlock != NULL) { + target_addr_t newAddress = fTargetAddress; + target_addr_t maxAddress = fTargetBlock->BaseAddress() + + fTargetBlock->Size() - 1; + int32 blockSize = 1; + if (fHexMode != HexModeNone) + blockSize = 1 << (fHexMode - 1); + int32 lineCount = int32(Bounds().Height() / fLineHeight); + + switch(bytes[0]) { + case B_UP_ARROW: + { + newAddress -= blockSize * fHexBlocksPerLine; + break; + } + case B_DOWN_ARROW: + { + newAddress += blockSize * fHexBlocksPerLine; + break; + } + case B_LEFT_ARROW: + { + newAddress -= blockSize; + break; + } + case B_RIGHT_ARROW: + { + newAddress += blockSize; + break; + } + case B_PAGE_UP: + { + newAddress -= (blockSize * fHexBlocksPerLine) * lineCount; + break; + } + case B_PAGE_DOWN: + { + newAddress += (blockSize * fHexBlocksPerLine) * lineCount; + break; + } + case B_HOME: + { + newAddress = fTargetBlock->BaseAddress(); + break; + } + case B_END: + { + newAddress = maxAddress; + break; + } + default: + { + handled = false; + break; + } + } + if (handled) { + if (newAddress < fTargetBlock->BaseAddress()) + newAddress = fTargetAddress; + else if (newAddress > maxAddress) + newAddress = maxAddress; + + if (newAddress != fTargetAddress) { + fTargetAddress = newAddress; + BMessenger(this).SendMessage(MSG_TARGET_ADDRESS_CHANGED); + } + } + } else + handled = false; + + if (!handled) + BView::KeyDown(bytes, numBytes); +} + + +void +MemoryView::MakeFocus(bool isFocused) +{ + BScrollView* parent = dynamic_cast(Parent()); + if (parent != NULL) + parent->SetBorderHighlighted(isFocused); + + BView::MakeFocus(isFocused); +} + + void MemoryView::MessageReceived(BMessage* message) { @@ -296,6 +366,43 @@ MemoryView::MessageReceived(BMessage* message) } +void +MemoryView::MouseDown(BPoint point) +{ + if (!IsFocus()) + MakeFocus(true); + + BView::MouseDown(point); +} + + +void +MemoryView::ScrollToSelection() +{ + if (fTargetBlock != NULL) { + target_addr_t offset = fTargetAddress - fTargetBlock->BaseAddress(); + int32 lineNumber = 0; + if (fHexBlocksPerLine > 0) + lineNumber = offset / (fHexBlocksPerLine * (1 << (fHexMode - 1))); + else if (fTextCharsPerLine > 0) + lineNumber = offset / fTextCharsPerLine; + float y = lineNumber * fLineHeight; + if (y < Bounds().top) + ScrollTo(0.0, y); + else if (y + fLineHeight > Bounds().bottom) + ScrollTo(0.0, y + fLineHeight - Bounds().Height()); + } +} + + +void +MemoryView::TargetedByScrollView(BScrollView* scrollView) +{ + BView::TargetedByScrollView(scrollView); + scrollView->ScrollBar(B_VERTICAL)->SetRange(0.0, 0.0); +} + + void MemoryView::_Init() { @@ -373,21 +480,19 @@ MemoryView::_GetNextHexBlock(char* buffer, int32 bufferSize, case HexMode16BitInt: { uint16 data = *((const uint16*)address); - if (fCurrentEndianMode != fHostEndianMode) { - switch(fCurrentEndianMode) + switch(fCurrentEndianMode) + { + case EndianModeBigEndian: { - case EndianModeBigEndian: - { - data = B_HOST_TO_BENDIAN_INT16(data); - } - break; - - case EndianModeLittleEndian: - { - data = B_HOST_TO_LENDIAN_INT16(data); - } - break; + data = B_HOST_TO_BENDIAN_INT16(data); } + break; + + case EndianModeLittleEndian: + { + data = B_HOST_TO_LENDIAN_INT16(data); + } + break; } snprintf(buffer, bufferSize, "%04" B_PRIx16, data); @@ -396,21 +501,19 @@ MemoryView::_GetNextHexBlock(char* buffer, int32 bufferSize, case HexMode32BitInt: { uint32 data = *((const uint32*)address); - if (fCurrentEndianMode != fHostEndianMode) { - switch(fCurrentEndianMode) + switch(fCurrentEndianMode) + { + case EndianModeBigEndian: { - case EndianModeBigEndian: - { - data = B_HOST_TO_BENDIAN_INT32(data); - } - break; - - case EndianModeLittleEndian: - { - data = B_HOST_TO_LENDIAN_INT32(data); - } - break; + data = B_HOST_TO_BENDIAN_INT32(data); } + break; + + case EndianModeLittleEndian: + { + data = B_HOST_TO_LENDIAN_INT32(data); + } + break; } snprintf(buffer, bufferSize, "%08" B_PRIx32, data); @@ -419,21 +522,19 @@ MemoryView::_GetNextHexBlock(char* buffer, int32 bufferSize, case HexMode64BitInt: { uint64 data = *((const uint16*)address); - if (fCurrentEndianMode != fHostEndianMode) { - switch(fCurrentEndianMode) + switch(fCurrentEndianMode) + { + case EndianModeBigEndian: { - case EndianModeBigEndian: - { - data = B_HOST_TO_BENDIAN_INT64(data); - } - break; - - case EndianModeLittleEndian: - { - data = B_HOST_TO_LENDIAN_INT64(data); - } - break; + data = B_HOST_TO_BENDIAN_INT64(data); } + break; + + case EndianModeLittleEndian: + { + data = B_HOST_TO_LENDIAN_INT64(data); + } + break; } snprintf(buffer, bufferSize, "%0*" B_PRIx64, 16, data); diff --git a/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.h b/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.h index 97855ac38d..68bd8af7d4 100644 --- a/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.h +++ b/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.h @@ -46,24 +46,24 @@ class TeamMemoryBlock; class MemoryView : public BView { public: - MemoryView(int32 hostEndianMode, - int32 targetEndianMode); + MemoryView(::Team* team); virtual ~MemoryView(); - static MemoryView* Create(int32 hostEndianMode, - int32 targetEndianMode); - // throws + static MemoryView* Create(::Team* team); + // thrws void SetTargetAddress(TeamMemoryBlock* block, target_addr_t address); - void ScrollToSelection(); - - virtual void TargetedByScrollView(BScrollView* scrollView); virtual void AttachedToWindow(); virtual void Draw(BRect rect); virtual void FrameResized(float width, float height); + virtual void KeyDown(const char* bytes, int32 numBytes); + virtual void MakeFocus(bool isFocused); virtual void MessageReceived(BMessage* message); + virtual void MouseDown(BPoint point); + void ScrollToSelection(); + virtual void TargetedByScrollView(BScrollView* scrollView); private: void _Init(); @@ -72,6 +72,7 @@ private: int32 bufferSize, const char* address); private: + ::Team* fTeam; TeamMemoryBlock* fTargetBlock; target_addr_t fTargetAddress; float fCharWidth; @@ -79,8 +80,6 @@ private: int32 fTextCharsPerLine; int32 fHexBlocksPerLine; int32 fCurrentEndianMode; - int32 fHostEndianMode; - int32 fTargetEndianMode; int32 fHexMode; int32 fTextMode; };