diff --git a/headers/os/interface/ScrollBar.h b/headers/os/interface/ScrollBar.h index cda8b4e257..03617969f1 100644 --- a/headers/os/interface/ScrollBar.h +++ b/headers/os/interface/ScrollBar.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001-2006, Haiku, Inc. + * Copyright (c) 2001-2008, Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT license. * * Authors: @@ -71,6 +71,10 @@ class BScrollBar : public BView { virtual void AllDetached(); virtual status_t GetSupportedSuites(BMessage *data); + virtual BSize MinSize(); + virtual BSize MaxSize(); + virtual BSize PreferredSize(); + virtual status_t Perform(perform_code d, void *arg); #if DISABLES_ON_WINDOW_DEACTIVATION @@ -106,6 +110,8 @@ class BScrollBar : public BView { const BRect& updateRect, bool enabled, bool down); + BSize _MinSize() const; + float fMin; float fMax; float fSmallStep; diff --git a/src/kits/interface/ScrollBar.cpp b/src/kits/interface/ScrollBar.cpp index 5918cf954a..0c61541fe4 100644 --- a/src/kits/interface/ScrollBar.cpp +++ b/src/kits/interface/ScrollBar.cpp @@ -12,6 +12,7 @@ #include +#include #include #include #include @@ -1083,6 +1084,37 @@ BScrollBar::GetSupportedSuites(BMessage *message) } +BSize +BScrollBar::MinSize() +{ + return BLayoutUtils::ComposeSize(ExplicitMinSize(), _MinSize()); +} + + +BSize +BScrollBar::MaxSize() +{ + BSize maxSize = _MinSize(); + if (fOrientation == B_HORIZONTAL) + maxSize.width = B_SIZE_UNLIMITED; + else + maxSize.height = B_SIZE_UNLIMITED; + return BLayoutUtils::ComposeSize(ExplicitMaxSize(), maxSize); +} + + +BSize +BScrollBar::PreferredSize() +{ + BSize preferredSize = _MinSize(); + if (fOrientation == B_HORIZONTAL) + preferredSize.width = 2 * preferredSize.width; + else + preferredSize.height = 2 * preferredSize.height; + return BLayoutUtils::ComposeSize(ExplicitPreferredSize(), preferredSize); +} + + status_t BScrollBar::Perform(perform_code d, void* arg) { @@ -1643,3 +1675,20 @@ BScrollBar::_DrawArrowButton(int32 direction, bool doubleArrows, BRect r, EndLineArray(); } + +BSize +BScrollBar::_MinSize() const +{ + BSize minSize; + if (fOrientation == B_HORIZONTAL) { + minSize.width = 2 * B_V_SCROLL_BAR_WIDTH + + 2 * fPrivateData->fScrollBarInfo.min_knob_size; + minSize.height = B_H_SCROLL_BAR_HEIGHT; + } else { + minSize.width = B_V_SCROLL_BAR_WIDTH; + minSize.height = 2 * B_H_SCROLL_BAR_HEIGHT + + 2 * fPrivateData->fScrollBarInfo.min_knob_size; + } + return minSize; +} +