Now maintains the Selection/Native/Swapped menu items (which contain the
block position where the currently selected bytes would point to). git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6740 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
32d3a4554d
commit
35f497aa98
@ -625,7 +625,7 @@ HeaderView::NotifyTarget()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
HeaderView::MessageReceived(BMessage *message)
|
HeaderView::MessageReceived(BMessage *message)
|
||||||
{
|
{
|
||||||
switch (message->what) {
|
switch (message->what) {
|
||||||
@ -676,11 +676,17 @@ HeaderView::MessageReceived(BMessage *message)
|
|||||||
{
|
{
|
||||||
fLastPosition = fPosition;
|
fLastPosition = fPosition;
|
||||||
|
|
||||||
|
off_t position;
|
||||||
int32 delta;
|
int32 delta;
|
||||||
if (message->FindInt32("delta", &delta) != B_OK)
|
if (message->FindInt64("position", &position) == B_OK)
|
||||||
fPosition = strtoll(fPositionControl->Text(), NULL, 0) * fBlockSize;
|
fPosition = position;
|
||||||
else
|
else if (message->FindInt32("delta", &delta) == B_OK)
|
||||||
fPosition += delta * off_t(fBlockSize);
|
fPosition += delta * off_t(fBlockSize);
|
||||||
|
else
|
||||||
|
fPosition = strtoll(fPositionControl->Text(), NULL, 0) * fBlockSize;
|
||||||
|
|
||||||
|
fPosition = (fPosition / fBlockSize) * fBlockSize;
|
||||||
|
// round to block size
|
||||||
|
|
||||||
// update views
|
// update views
|
||||||
UpdatePositionViews();
|
UpdatePositionViews();
|
||||||
@ -1040,7 +1046,15 @@ ProbeView::AttachedToWindow()
|
|||||||
item->SetTarget(fHeaderView);
|
item->SetTarget(fHeaderView);
|
||||||
|
|
||||||
BMenu *subMenu = new BMenu("Selection");
|
BMenu *subMenu = new BMenu("Selection");
|
||||||
|
message = new BMessage(kMsgPositionUpdate);
|
||||||
|
message->AddInt64("position", 0);
|
||||||
|
subMenu->AddItem(fNativeMenuItem = new BMenuItem("", message, 'K', B_COMMAND_KEY));
|
||||||
|
fNativeMenuItem->SetTarget(fHeaderView);
|
||||||
|
message = new BMessage(*message);
|
||||||
|
subMenu->AddItem(fSwappedMenuItem = new BMenuItem("", message, 'L', B_COMMAND_KEY));
|
||||||
|
fSwappedMenuItem->SetTarget(fHeaderView);
|
||||||
menu->AddItem(new BMenuItem(subMenu));
|
menu->AddItem(new BMenuItem(subMenu));
|
||||||
|
UpdateSelectionMenuItems(0, 0);
|
||||||
menu->AddSeparatorItem();
|
menu->AddSeparatorItem();
|
||||||
|
|
||||||
menu->AddItem(new BMenuItem("Write", NULL, 'S', B_COMMAND_KEY));
|
menu->AddItem(new BMenuItem("Write", NULL, 'S', B_COMMAND_KEY));
|
||||||
@ -1132,6 +1146,54 @@ ProbeView::WindowActivated(bool active)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ProbeView::UpdateSelectionMenuItems(int64 start, int64 end)
|
||||||
|
{
|
||||||
|
int64 position = 0;
|
||||||
|
const uint8 *data = fDataView->DataAt(start);
|
||||||
|
if (data == NULL) {
|
||||||
|
fNativeMenuItem->SetEnabled(false);
|
||||||
|
fSwappedMenuItem->SetEnabled(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// retrieve native endian position
|
||||||
|
|
||||||
|
int size;
|
||||||
|
if (end < start + 8)
|
||||||
|
size = end + 1 - start;
|
||||||
|
else
|
||||||
|
size = 8;
|
||||||
|
|
||||||
|
int64 bigEndianPosition = 0;
|
||||||
|
memcpy(&bigEndianPosition, data, size);
|
||||||
|
|
||||||
|
position = B_BENDIAN_TO_HOST_INT64(bigEndianPosition) >> (8 * (8 - size));
|
||||||
|
|
||||||
|
// update menu items
|
||||||
|
|
||||||
|
char buffer[128];
|
||||||
|
if (fDataView->Base() == kHexBase)
|
||||||
|
snprintf(buffer, sizeof(buffer), "Native: 0x%0*Lx", size * 2, position);
|
||||||
|
else
|
||||||
|
snprintf(buffer, sizeof(buffer), "Native: %Ld (0x%0*Lx)", position, size * 2, position);
|
||||||
|
|
||||||
|
fNativeMenuItem->SetLabel(buffer);
|
||||||
|
fNativeMenuItem->SetEnabled(position >= 0 && position < fEditor.FileSize());
|
||||||
|
fNativeMenuItem->Message()->ReplaceInt64("position", position * fEditor.BlockSize());
|
||||||
|
|
||||||
|
position = B_SWAP_INT64(position) >> (8 * (8 - size));
|
||||||
|
if (fDataView->Base() == kHexBase)
|
||||||
|
snprintf(buffer, sizeof(buffer), "Swapped: 0x%0*Lx", size * 2, position);
|
||||||
|
else
|
||||||
|
snprintf(buffer, sizeof(buffer), "Swapped: %Ld (0x%0*Lx)", position, size * 2, position);
|
||||||
|
|
||||||
|
fSwappedMenuItem->SetLabel(buffer);
|
||||||
|
fSwappedMenuItem->SetEnabled(position >= 0 && position < fEditor.FileSize());
|
||||||
|
fSwappedMenuItem->Message()->ReplaceInt64("position", position * fEditor.BlockSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ProbeView::CheckClipboard()
|
ProbeView::CheckClipboard()
|
||||||
{
|
{
|
||||||
@ -1158,6 +1220,24 @@ void
|
|||||||
ProbeView::MessageReceived(BMessage *message)
|
ProbeView::MessageReceived(BMessage *message)
|
||||||
{
|
{
|
||||||
switch (message->what) {
|
switch (message->what) {
|
||||||
|
case B_OBSERVER_NOTICE_CHANGE: {
|
||||||
|
int32 what;
|
||||||
|
if (message->FindInt32(B_OBSERVE_WHAT_CHANGE, &what) != B_OK)
|
||||||
|
break;
|
||||||
|
|
||||||
|
switch (what) {
|
||||||
|
case kDataViewSelection:
|
||||||
|
{
|
||||||
|
int64 start, end;
|
||||||
|
if (message->FindInt64("start", &start) == B_OK
|
||||||
|
&& message->FindInt64("end", &end) == B_OK)
|
||||||
|
UpdateSelectionMenuItems(start, end);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case kMsgBaseType:
|
case kMsgBaseType:
|
||||||
{
|
{
|
||||||
int32 type;
|
int32 type;
|
||||||
@ -1167,6 +1247,11 @@ ProbeView::MessageReceived(BMessage *message)
|
|||||||
fHeaderView->SetBase((base_type)type);
|
fHeaderView->SetBase((base_type)type);
|
||||||
fDataView->SetBase((base_type)type);
|
fDataView->SetBase((base_type)type);
|
||||||
|
|
||||||
|
// The selection menu items depend on the base type as well
|
||||||
|
int32 start, end;
|
||||||
|
fDataView->GetSelection(start, end);
|
||||||
|
UpdateSelectionMenuItems(start, end);
|
||||||
|
|
||||||
// update the applications settings
|
// update the applications settings
|
||||||
BMessage update(*message);
|
BMessage update(*message);
|
||||||
update.what = kMsgSettingsChanged;
|
update.what = kMsgSettingsChanged;
|
||||||
|
@ -41,6 +41,7 @@ class ProbeView : public BView {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void UpdateAttributesMenu(BMenu *menu);
|
void UpdateAttributesMenu(BMenu *menu);
|
||||||
|
void UpdateSelectionMenuItems(int64 start, int64 end);
|
||||||
void CheckClipboard();
|
void CheckClipboard();
|
||||||
|
|
||||||
DataEditor fEditor;
|
DataEditor fEditor;
|
||||||
@ -50,6 +51,7 @@ class ProbeView : public BView {
|
|||||||
BScrollView *fScrollView;
|
BScrollView *fScrollView;
|
||||||
BMenuItem *fPasteMenuItem;
|
BMenuItem *fPasteMenuItem;
|
||||||
BMenuItem *fUndoMenuItem, *fRedoMenuItem;
|
BMenuItem *fUndoMenuItem, *fRedoMenuItem;
|
||||||
|
BMenuItem *fNativeMenuItem, *fSwappedMenuItem;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* PROBE_VIEW_H */
|
#endif /* PROBE_VIEW_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user