* 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
This commit is contained in:
@@ -147,17 +147,10 @@ InspectorWindow::_Init()
|
|||||||
fEndianMode->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
fEndianMode->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
||||||
fTextMode->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
fTextMode->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
||||||
|
|
||||||
Architecture* architecture = fTeam->GetArchitecture();
|
int32 targetEndian = fTeam->GetArchitecture()->IsBigEndian()
|
||||||
int32 hostEndian;
|
? EndianModeBigEndian : EndianModeLittleEndian;
|
||||||
int32 targetEndian;
|
|
||||||
targetEndian = architecture->IsBigEndian() ? EndianModeBigEndian
|
|
||||||
: EndianModeLittleEndian;
|
|
||||||
hostEndian = architecture->IsHostEndian() ? targetEndian
|
|
||||||
: architecture->IsBigEndian() ? EndianModeLittleEndian
|
|
||||||
: EndianModeBigEndian;
|
|
||||||
|
|
||||||
scrollView->SetTarget(fMemoryView = MemoryView::Create(hostEndian,
|
scrollView->SetTarget(fMemoryView = MemoryView::Create(fTeam));
|
||||||
targetEndian));
|
|
||||||
|
|
||||||
fAddressInput->SetTarget(this);
|
fAddressInput->SetTarget(this);
|
||||||
fPreviousBlockButton->SetTarget(this);
|
fPreviousBlockButton->SetTarget(this);
|
||||||
@@ -176,7 +169,7 @@ InspectorWindow::_Init()
|
|||||||
hexMenu->ItemAt(1)->SetMarked(true);
|
hexMenu->ItemAt(1)->SetMarked(true);
|
||||||
textMenu->ItemAt(1)->SetMarked(true);
|
textMenu->ItemAt(1)->SetMarked(true);
|
||||||
|
|
||||||
if (architecture->IsBigEndian())
|
if (targetEndian == EndianModeBigEndian)
|
||||||
endianMenu->ItemAt(1)->SetMarked(true);
|
endianMenu->ItemAt(1)->SetMarked(true);
|
||||||
else
|
else
|
||||||
endianMenu->ItemAt(0)->SetMarked(true);
|
endianMenu->ItemAt(0)->SetMarked(true);
|
||||||
|
|||||||
@@ -11,10 +11,13 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <ByteOrder.h>
|
#include <ByteOrder.h>
|
||||||
|
#include <Looper.h>
|
||||||
#include <Messenger.h>
|
#include <Messenger.h>
|
||||||
#include <ScrollView.h>
|
#include <ScrollView.h>
|
||||||
#include <String.h>
|
#include <String.h>
|
||||||
|
|
||||||
|
#include "Architecture.h"
|
||||||
|
#include "Team.h"
|
||||||
#include "TeamMemoryBlock.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),
|
fTargetBlock(NULL),
|
||||||
fTargetAddress(0LL),
|
fTargetAddress(0LL),
|
||||||
fCharWidth(0.0),
|
fCharWidth(0.0),
|
||||||
fLineHeight(0.0),
|
fLineHeight(0.0),
|
||||||
fTextCharsPerLine(0),
|
fTextCharsPerLine(0),
|
||||||
fHexBlocksPerLine(0),
|
fHexBlocksPerLine(0),
|
||||||
fCurrentEndianMode(hostEndianMode),
|
fCurrentEndianMode(team->GetArchitecture()->IsBigEndian()
|
||||||
fHostEndianMode(hostEndianMode),
|
? EndianModeBigEndian : EndianModeLittleEndian),
|
||||||
fTargetEndianMode(targetEndianMode),
|
|
||||||
fHexMode(HexMode8BitInt),
|
fHexMode(HexMode8BitInt),
|
||||||
fTextMode(TextModeASCII)
|
fTextMode(TextModeASCII)
|
||||||
{
|
{
|
||||||
@@ -49,9 +53,9 @@ MemoryView::~MemoryView()
|
|||||||
|
|
||||||
|
|
||||||
/*static */ 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 {
|
try {
|
||||||
self->_Init();
|
self->_Init();
|
||||||
@@ -73,35 +77,11 @@ MemoryView::SetTargetAddress(TeamMemoryBlock* block, target_addr_t address)
|
|||||||
|
|
||||||
fTargetBlock = block;
|
fTargetBlock = block;
|
||||||
fTargetBlock->AcquireReference();
|
fTargetBlock->AcquireReference();
|
||||||
|
MakeFocus(true);
|
||||||
BMessenger(this).SendMessage(MSG_TARGET_ADDRESS_CHANGED);
|
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
|
void
|
||||||
MemoryView::AttachedToWindow()
|
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<BScrollView*>(Parent());
|
||||||
|
if (parent != NULL)
|
||||||
|
parent->SetBorderHighlighted(isFocused);
|
||||||
|
|
||||||
|
BView::MakeFocus(isFocused);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
MemoryView::MessageReceived(BMessage* message)
|
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
|
void
|
||||||
MemoryView::_Init()
|
MemoryView::_Init()
|
||||||
{
|
{
|
||||||
@@ -373,21 +480,19 @@ MemoryView::_GetNextHexBlock(char* buffer, int32 bufferSize,
|
|||||||
case HexMode16BitInt:
|
case HexMode16BitInt:
|
||||||
{
|
{
|
||||||
uint16 data = *((const uint16*)address);
|
uint16 data = *((const uint16*)address);
|
||||||
if (fCurrentEndianMode != fHostEndianMode) {
|
switch(fCurrentEndianMode)
|
||||||
switch(fCurrentEndianMode)
|
{
|
||||||
|
case EndianModeBigEndian:
|
||||||
{
|
{
|
||||||
case EndianModeBigEndian:
|
data = B_HOST_TO_BENDIAN_INT16(data);
|
||||||
{
|
|
||||||
data = B_HOST_TO_BENDIAN_INT16(data);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EndianModeLittleEndian:
|
|
||||||
{
|
|
||||||
data = B_HOST_TO_LENDIAN_INT16(data);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EndianModeLittleEndian:
|
||||||
|
{
|
||||||
|
data = B_HOST_TO_LENDIAN_INT16(data);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
snprintf(buffer, bufferSize, "%04" B_PRIx16,
|
snprintf(buffer, bufferSize, "%04" B_PRIx16,
|
||||||
data);
|
data);
|
||||||
@@ -396,21 +501,19 @@ MemoryView::_GetNextHexBlock(char* buffer, int32 bufferSize,
|
|||||||
case HexMode32BitInt:
|
case HexMode32BitInt:
|
||||||
{
|
{
|
||||||
uint32 data = *((const uint32*)address);
|
uint32 data = *((const uint32*)address);
|
||||||
if (fCurrentEndianMode != fHostEndianMode) {
|
switch(fCurrentEndianMode)
|
||||||
switch(fCurrentEndianMode)
|
{
|
||||||
|
case EndianModeBigEndian:
|
||||||
{
|
{
|
||||||
case EndianModeBigEndian:
|
data = B_HOST_TO_BENDIAN_INT32(data);
|
||||||
{
|
|
||||||
data = B_HOST_TO_BENDIAN_INT32(data);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EndianModeLittleEndian:
|
|
||||||
{
|
|
||||||
data = B_HOST_TO_LENDIAN_INT32(data);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EndianModeLittleEndian:
|
||||||
|
{
|
||||||
|
data = B_HOST_TO_LENDIAN_INT32(data);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
snprintf(buffer, bufferSize, "%08" B_PRIx32,
|
snprintf(buffer, bufferSize, "%08" B_PRIx32,
|
||||||
data);
|
data);
|
||||||
@@ -419,21 +522,19 @@ MemoryView::_GetNextHexBlock(char* buffer, int32 bufferSize,
|
|||||||
case HexMode64BitInt:
|
case HexMode64BitInt:
|
||||||
{
|
{
|
||||||
uint64 data = *((const uint16*)address);
|
uint64 data = *((const uint16*)address);
|
||||||
if (fCurrentEndianMode != fHostEndianMode) {
|
switch(fCurrentEndianMode)
|
||||||
switch(fCurrentEndianMode)
|
{
|
||||||
|
case EndianModeBigEndian:
|
||||||
{
|
{
|
||||||
case EndianModeBigEndian:
|
data = B_HOST_TO_BENDIAN_INT64(data);
|
||||||
{
|
|
||||||
data = B_HOST_TO_BENDIAN_INT64(data);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EndianModeLittleEndian:
|
|
||||||
{
|
|
||||||
data = B_HOST_TO_LENDIAN_INT64(data);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EndianModeLittleEndian:
|
||||||
|
{
|
||||||
|
data = B_HOST_TO_LENDIAN_INT64(data);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
snprintf(buffer, bufferSize, "%0*" B_PRIx64,
|
snprintf(buffer, bufferSize, "%0*" B_PRIx64,
|
||||||
16, data);
|
16, data);
|
||||||
|
|||||||
@@ -46,24 +46,24 @@ class TeamMemoryBlock;
|
|||||||
|
|
||||||
class MemoryView : public BView {
|
class MemoryView : public BView {
|
||||||
public:
|
public:
|
||||||
MemoryView(int32 hostEndianMode,
|
MemoryView(::Team* team);
|
||||||
int32 targetEndianMode);
|
|
||||||
virtual ~MemoryView();
|
virtual ~MemoryView();
|
||||||
|
|
||||||
static MemoryView* Create(int32 hostEndianMode,
|
static MemoryView* Create(::Team* team);
|
||||||
int32 targetEndianMode);
|
// thrws
|
||||||
// throws
|
|
||||||
|
|
||||||
void SetTargetAddress(TeamMemoryBlock* block,
|
void SetTargetAddress(TeamMemoryBlock* block,
|
||||||
target_addr_t address);
|
target_addr_t address);
|
||||||
void ScrollToSelection();
|
|
||||||
|
|
||||||
virtual void TargetedByScrollView(BScrollView* scrollView);
|
|
||||||
|
|
||||||
virtual void AttachedToWindow();
|
virtual void AttachedToWindow();
|
||||||
virtual void Draw(BRect rect);
|
virtual void Draw(BRect rect);
|
||||||
virtual void FrameResized(float width, float height);
|
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 MessageReceived(BMessage* message);
|
||||||
|
virtual void MouseDown(BPoint point);
|
||||||
|
void ScrollToSelection();
|
||||||
|
virtual void TargetedByScrollView(BScrollView* scrollView);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void _Init();
|
void _Init();
|
||||||
@@ -72,6 +72,7 @@ private:
|
|||||||
int32 bufferSize, const char* address);
|
int32 bufferSize, const char* address);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
::Team* fTeam;
|
||||||
TeamMemoryBlock* fTargetBlock;
|
TeamMemoryBlock* fTargetBlock;
|
||||||
target_addr_t fTargetAddress;
|
target_addr_t fTargetAddress;
|
||||||
float fCharWidth;
|
float fCharWidth;
|
||||||
@@ -79,8 +80,6 @@ private:
|
|||||||
int32 fTextCharsPerLine;
|
int32 fTextCharsPerLine;
|
||||||
int32 fHexBlocksPerLine;
|
int32 fHexBlocksPerLine;
|
||||||
int32 fCurrentEndianMode;
|
int32 fCurrentEndianMode;
|
||||||
int32 fHostEndianMode;
|
|
||||||
int32 fTargetEndianMode;
|
|
||||||
int32 fHexMode;
|
int32 fHexMode;
|
||||||
int32 fTextMode;
|
int32 fTextMode;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user