The PositionSlider no longer allows to go beyond the last block (starting

with 0!) by one. Also, SetFileSize() now checks if the position is within
valid bounds.
The device offset is now correctly maintained (it also adds the view offset).
The view offset is now taken into account, too (but it doesn't yet get any
updates from the DataView).


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6625 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2004-02-18 04:34:04 +00:00
parent 15fef5f790
commit b95c3b6860

View File

@ -93,11 +93,13 @@ class HeaderView : public BView, public BInvoker {
private:
void FormatValue(char *buffer, size_t bufferSize, off_t value);
void UpdatePositionViews(off_t position);
void UpdateOffsetViews(off_t position, bool all = true);
void UpdateFileSizeView();
const char *fAttribute;
off_t fFileSize;
uint32 fBlockSize;
off_t fOffset;
base_type fBase;
BTextControl *fPositionControl;
@ -249,7 +251,7 @@ PositionSlider::DrawBar()
void
PositionSlider::Reset()
{
SetKeyIncrementValue(int32(1.0 * kMaxSliderLimit / (fSize / fBlockSize) + 0.5));
SetKeyIncrementValue(int32(1.0 * kMaxSliderLimit / ((fSize - 1) / fBlockSize) + 0.5));
}
@ -264,7 +266,7 @@ PositionSlider::Position() const
// For example, with a block size of 512 bytes, it should be good enough for about
// 1024 GB - and that's not really that far away these days.
return (off_t(1.0 * fSize * Value() / kMaxSliderLimit + 0.5) / fBlockSize) * fBlockSize;
return (off_t(1.0 * (fSize - 1) * Value() / kMaxSliderLimit + 0.5) / fBlockSize) * fBlockSize;
}
@ -272,7 +274,7 @@ void
PositionSlider::SetPosition(off_t position)
{
position /= fBlockSize;
SetValue(int32(1.0 * kMaxSliderLimit * position / (fSize / fBlockSize) + 0.5));
SetValue(int32(1.0 * kMaxSliderLimit * position / ((fSize - 1) / fBlockSize) + 0.5));
}
@ -283,6 +285,9 @@ PositionSlider::SetSize(off_t size)
return;
off_t position = Position();
if (position >= size)
position = size - 1;
fSize = size;
Reset();
SetPosition(position);
@ -310,6 +315,7 @@ HeaderView::HeaderView(BRect frame, entry_ref *ref, DataEditor &editor)
fAttribute(editor.Attribute()),
fFileSize(editor.FileSize()),
fBlockSize(editor.BlockSize()),
fOffset(0),
fBase(kHexBase)
{
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
@ -380,6 +386,7 @@ HeaderView::HeaderView(BRect frame, entry_ref *ref, DataEditor &editor)
fOffsetView = new BStringView(rect, B_EMPTY_STRING, "0x0");
fOffsetView->SetFont(&plainFont);
AddChild(fOffsetView);
UpdateOffsetViews(0LL, false);
rect.left = rect.right + 4;
rect.right = frame.right;
@ -461,11 +468,25 @@ HeaderView::UpdatePositionViews(off_t position)
FormatValue(buffer, sizeof(buffer), position / fBlockSize);
fPositionControl->SetText(buffer);
FormatValue(buffer, sizeof(buffer), position);
FormatValue(buffer, sizeof(buffer), position + fOffset);
fFileOffsetView->SetText(buffer);
}
void
HeaderView::UpdateOffsetViews(off_t position, bool all)
{
char buffer[64];
FormatValue(buffer, sizeof(buffer), fOffset);
fOffsetView->SetText(buffer);
if (all) {
FormatValue(buffer, sizeof(buffer), position + fOffset);
fFileOffsetView->SetText(buffer);
}
}
void
HeaderView::UpdateFileSizeView()
{
@ -483,7 +504,10 @@ HeaderView::SetBase(base_type type)
return;
fBase = type;
UpdatePositionViews(fPositionSlider->Position());
off_t position = fPositionSlider->Position();
UpdatePositionViews(position);
UpdateOffsetViews(position, false);
UpdateFileSizeView();
}