* Add previous/next block navigation buttons.

* Fix a calculation error with respect to the last line of the block.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42216 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Rene Gollent
2011-06-16 22:45:40 +00:00
parent 71b9d8cf3b
commit 21e484aea9
3 changed files with 82 additions and 23 deletions
@@ -9,7 +9,9 @@
#include <Alert.h> #include <Alert.h>
#include <Application.h> #include <Application.h>
#include <Autolock.h>
#include <Button.h> #include <Button.h>
#include <ControlLook.h>
#include <LayoutBuilder.h> #include <LayoutBuilder.h>
#include <ScrollView.h> #include <ScrollView.h>
#include <TextControl.h> #include <TextControl.h>
@@ -22,6 +24,12 @@
#include "UserInterface.h" #include "UserInterface.h"
enum {
MSG_NAVIGATE_PREVIOUS_BLOCK = 'npbl',
MSG_NAVIGATE_NEXT_BLOCK = 'npnl'
};
InspectorWindow::InspectorWindow(::Team* team, UserInterfaceListener* listener) InspectorWindow::InspectorWindow(::Team* team, UserInterfaceListener* listener)
: :
BWindow(BRect(100, 100, 700, 500), "Inspector", B_TITLED_WINDOW, BWindow(BRect(100, 100, 700, 500), "Inspector", B_TITLED_WINDOW,
@@ -99,9 +107,15 @@ InspectorWindow::_Init()
BLayoutBuilder::Group<>(this, B_VERTICAL) BLayoutBuilder::Group<>(this, B_VERTICAL)
.SetInsets(4.0f, 4.0f, 4.0f, 4.0f) .SetInsets(4.0f, 4.0f, 4.0f, 4.0f)
.AddGroup(B_HORIZONTAL, 4.0f)
.Add(fAddressInput = new BTextControl("addrInput", .Add(fAddressInput = new BTextControl("addrInput",
"Target Address:", "", "Target Address:", "",
new BMessage(MSG_INSPECT_ADDRESS))) new BMessage(MSG_INSPECT_ADDRESS)))
.Add(fPreviousBlockButton = new BButton("navPrevious", "<",
new BMessage(MSG_NAVIGATE_PREVIOUS_BLOCK)))
.Add(fNextBlockButton = new BButton("navNext", ">",
new BMessage(MSG_NAVIGATE_NEXT_BLOCK)))
.End()
.AddGroup(B_HORIZONTAL, 4.0f) .AddGroup(B_HORIZONTAL, 4.0f)
.Add(fHexMode = new BMenuField("outputStyle", "Hex Mode:", .Add(fHexMode = new BMenuField("outputStyle", "Hex Mode:",
hexMenu)) hexMenu))
@@ -119,6 +133,10 @@ InspectorWindow::_Init()
scrollView->SetTarget(fMemoryView = MemoryView::Create()); scrollView->SetTarget(fMemoryView = MemoryView::Create());
fAddressInput->SetTarget(this); fAddressInput->SetTarget(this);
fPreviousBlockButton->SetTarget(this);
fNextBlockButton->SetTarget(this);
fPreviousBlockButton->SetEnabled(false);
fNextBlockButton->SetEnabled(false);
hexMenu->SetLabelFromMarked(true); hexMenu->SetLabelFromMarked(true);
hexMenu->SetTargetForItems(fMemoryView); hexMenu->SetTargetForItems(fMemoryView);
@@ -137,10 +155,13 @@ InspectorWindow::MessageReceived(BMessage* msg)
{ {
switch (msg->what) { switch (msg->what) {
case MSG_INSPECT_ADDRESS: case MSG_INSPECT_ADDRESS:
{
target_addr_t address = 0;
bool addressValid = false;
if (msg->FindUInt64("address", &address) != B_OK)
{ {
ExpressionParser parser; ExpressionParser parser;
parser.SetSupportHexInput(true); parser.SetSupportHexInput(true);
target_addr_t address = 0;
const char* addressExpression = fAddressInput->Text(); const char* addressExpression = fAddressInput->Text();
BString errorMessage; BString errorMessage;
try { try {
@@ -158,7 +179,13 @@ InspectorWindow::MessageReceived(BMessage* msg)
errorMessage.String(), "Close"); errorMessage.String(), "Close");
if (alert != NULL) if (alert != NULL)
alert->Go(); alert->Go();
} else
addressValid = true;
} else { } else {
addressValid = true;
}
if (addressValid) {
if (fCurrentBlock != NULL if (fCurrentBlock != NULL
&& !fCurrentBlock->Contains(address)) { && !fCurrentBlock->Contains(address)) {
fCurrentBlock->ReleaseReference(); fCurrentBlock->ReleaseReference();
@@ -177,6 +204,31 @@ InspectorWindow::MessageReceived(BMessage* msg)
} }
break; break;
} }
case MSG_NAVIGATE_PREVIOUS_BLOCK:
case MSG_NAVIGATE_NEXT_BLOCK:
{
if (fCurrentBlock != NULL)
{
target_addr_t address = fCurrentBlock->BaseAddress();
if (msg->what == MSG_NAVIGATE_PREVIOUS_BLOCK)
address -= fCurrentBlock->Size();
else
address += fCurrentBlock->Size();
BMessage setMessage(MSG_INSPECT_ADDRESS);
setMessage.AddUInt64("address", address);
PostMessage(&setMessage);
}
break;
}
{
break;
}
default:
{
BWindow::MessageReceived(msg);
break;
}
} }
} }
@@ -192,6 +244,11 @@ InspectorWindow::QuitRequested()
void void
InspectorWindow::MemoryBlockRetrieved(TeamMemoryBlock* block) InspectorWindow::MemoryBlockRetrieved(TeamMemoryBlock* block)
{ {
BAutolock lock(this);
if (lock.IsLocked()) {
fCurrentBlock = block; fCurrentBlock = block;
fMemoryView->SetTargetAddress(block, fCurrentAddress); fMemoryView->SetTargetAddress(block, fCurrentAddress);
fPreviousBlockButton->SetEnabled(true);
fNextBlockButton->SetEnabled(true);
}
} }
@@ -45,6 +45,8 @@ private:
BMenuField* fHexMode; BMenuField* fHexMode;
BMenuField* fTextMode; BMenuField* fTextMode;
MemoryView* fMemoryView; MemoryView* fMemoryView;
BButton* fPreviousBlockButton;
BButton* fNextBlockButton;
TeamMemoryBlock* fCurrentBlock; TeamMemoryBlock* fCurrentBlock;
target_addr_t fCurrentAddress; target_addr_t fCurrentAddress;
::Team* fTeam; ::Team* fTeam;
@@ -163,11 +163,11 @@ MemoryView::Draw(BRect rect)
PopState(); PopState();
if (fHexMode != HexModeNone) { if (fHexMode != HexModeNone) {
if (currentAddress + (currentBlocksPerLine * hexBlockSize) if (currentAddress + (currentBlocksPerLine * blockByteSize)
> maxAddress) { > maxAddress) {
currentCharsPerLine = maxAddress - currentAddress; currentCharsPerLine = maxAddress - currentAddress;
currentBlocksPerLine = currentCharsPerLine currentBlocksPerLine = currentCharsPerLine
/ hexBlockSize; / blockByteSize;
} }
for (int32 j = 0; j < currentBlocksPerLine; j++) { for (int32 j = 0; j < currentBlocksPerLine; j++) {