diff --git a/headers/private/interface/ColumnListView.h b/headers/private/interface/ColumnListView.h index 3b47bb2825..8d50f5bff6 100644 --- a/headers/private/interface/ColumnListView.h +++ b/headers/private/interface/ColumnListView.h @@ -247,6 +247,9 @@ public: const char* name, uint32 resizingMode, uint32 flags, border_style = B_NO_BORDER, bool showHorizontalScrollbar = true); + BColumnListView(const char* name, + uint32 flags, border_style = B_NO_BORDER, + bool showHorizontalScrollbar = true); virtual ~BColumnListView(); // Interaction @@ -370,8 +373,20 @@ protected: virtual void WindowActivated(bool active); virtual void Draw(BRect updateRect); + virtual BSize MinSize(); + virtual BSize PreferredSize(); + virtual BSize MaxSize(); + + virtual void InvalidateLayout(bool descendants = false); + virtual void DoLayout(); + private: void _Init(bool showHorizontalScrollbar); + void _GetChildViewRects(const BRect& bounds, + bool showHorizontalScrollBar, + BRect& titleRect, BRect& outlineRect, + BRect& vScrollBarRect, + BRect& hScrollBarRect); rgb_color fColorList[B_COLOR_TOTAL]; BPrivate::TitleView* fTitleView; diff --git a/src/kits/interface/ColumnListView.cpp b/src/kits/interface/ColumnListView.cpp index 7758403971..7a495c888d 100644 --- a/src/kits/interface/ColumnListView.cpp +++ b/src/kits/interface/ColumnListView.cpp @@ -55,6 +55,7 @@ All rights reserved. #include #include #include +#include #include #include #include @@ -767,8 +768,22 @@ BColumnListView::BColumnListView(BRect rect, const char* name, : BView(rect, name, resizingMode, flags | B_WILL_DRAW | B_FRAME_EVENTS | B_FULL_UPDATE_ON_RESIZE), - fStatusView(0), - fSelectionMessage(0), + fStatusView(NULL), + fSelectionMessage(NULL), + fSortingEnabled(true), + fLatchWidth(kLatchWidth), + fBorderStyle(border) +{ + _Init(showHorizontalScrollbar); +} + + +BColumnListView::BColumnListView(const char* name, uint32 flags, + border_style border, bool showHorizontalScrollbar) + : + BView(name, flags | B_WILL_DRAW | B_FRAME_EVENTS | B_FULL_UPDATE_ON_RESIZE), + fStatusView(NULL), + fSelectionMessage(NULL), fSortingEnabled(true), fLatchWidth(kLatchWidth), fBorderStyle(border) @@ -1772,6 +1787,176 @@ BColumnListView::Refresh() } +BSize +BColumnListView::MinSize() +{ + BSize size; + size.width = 100; + size.height = kTitleHeight + 3 * ceilf(be_plain_font->Size()); + if (!fHorizontalScrollBar->IsHidden()) + size.height += fHorizontalScrollBar->Frame().Height() + 1; + // TODO: Take border size into account + + return BLayoutUtils::ComposeSize(ExplicitMinSize(), size); +} + + +BSize +BColumnListView::PreferredSize() +{ + BSize size = MinSize(); + size.height += ceilf(be_plain_font->Size()) * 20; + // TODO: size.width = entire width of title view (all columns) + + return BLayoutUtils::ComposeSize(ExplicitPreferredSize(), size); +} + + +BSize +BColumnListView::MaxSize() +{ + BSize size(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED); + return BLayoutUtils::ComposeSize(ExplicitMaxSize(), size); +} + + +void +BColumnListView::InvalidateLayout(bool descendants) +{ + BView::InvalidateLayout(descendants); +} + + +void +BColumnListView::DoLayout() +{ + if (!(Flags() & B_SUPPORTS_LAYOUT)) + return; + + BRect titleRect; + BRect outlineRect; + BRect vScrollBarRect; + BRect hScrollBarRect; + _GetChildViewRects(Bounds(), !fHorizontalScrollBar->IsHidden(), + titleRect, outlineRect, vScrollBarRect, hScrollBarRect); + + fTitleView->MoveTo(titleRect.LeftTop()); + fTitleView->ResizeTo(titleRect.Width(), titleRect.Height()); + + fOutlineView->MoveTo(outlineRect.LeftTop()); + fOutlineView->ResizeTo(outlineRect.Width(), outlineRect.Height()); + + fVerticalScrollBar->MoveTo(vScrollBarRect.LeftTop()); + fVerticalScrollBar->ResizeTo(vScrollBarRect.Width(), + vScrollBarRect.Height()); + + fHorizontalScrollBar->MoveTo(hScrollBarRect.LeftTop()); + fHorizontalScrollBar->ResizeTo(hScrollBarRect.Width(), + hScrollBarRect.Height()); + + fOutlineView->FixScrollBar(true); +} + + +void +BColumnListView::_Init(bool showHorizontalScrollbar) +{ + SetViewColor(B_TRANSPARENT_32_BIT); + + BRect bounds(Bounds()); + if (bounds.Width() <= 0) + bounds.right = 100; + if (bounds.Height() <= 0) + bounds.bottom = 100; + + for (int i = 0; i < (int)B_COLOR_TOTAL; i++) + fColorList[i] = kColor[i]; + + BRect titleRect; + BRect outlineRect; + BRect vScrollBarRect; + BRect hScrollBarRect; + _GetChildViewRects(bounds, showHorizontalScrollbar, titleRect, outlineRect, + vScrollBarRect, hScrollBarRect); + + fOutlineView = new OutlineView(outlineRect, &fColumns, &fSortColumns, this); + AddChild(fOutlineView); + + + fTitleView = new TitleView(titleRect, fOutlineView, &fColumns, + &fSortColumns, this, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); + AddChild(fTitleView); + + fVerticalScrollBar = new BScrollBar(vScrollBarRect, "vertical_scroll_bar", + fOutlineView, 0.0, bounds.Height(), B_VERTICAL); + AddChild(fVerticalScrollBar); + + fHorizontalScrollBar = new BScrollBar(hScrollBarRect, + "horizontal_scroll_bar", fTitleView, 0.0, bounds.Width(), B_HORIZONTAL); + AddChild(fHorizontalScrollBar); + + if (!showHorizontalScrollbar) + fHorizontalScrollBar->Hide(); + + fOutlineView->FixScrollBar(true); +} + + +void +BColumnListView::_GetChildViewRects(const BRect& bounds, + bool showHorizontalScrollbar, BRect& titleRect, BRect& outlineRect, + BRect& vScrollBarRect, BRect& hScrollBarRect) +{ + titleRect = bounds; + titleRect.bottom = titleRect.top + kTitleHeight; +#if !LOWER_SCROLLBAR + titleRect.right -= B_V_SCROLL_BAR_WIDTH + 1; +#endif + + outlineRect = bounds; + outlineRect.top = titleRect.bottom + 1.0; + outlineRect.right -= B_V_SCROLL_BAR_WIDTH + 1; + if (showHorizontalScrollbar) + outlineRect.bottom -= B_H_SCROLL_BAR_HEIGHT + 1; + + vScrollBarRect = bounds; +#if LOWER_SCROLLBAR + vScrollBarRect.top += kTitleHeight; +#endif + + vScrollBarRect.left = vScrollBarRect.right - B_V_SCROLL_BAR_WIDTH; + if (showHorizontalScrollbar) + vScrollBarRect.bottom -= B_H_SCROLL_BAR_HEIGHT; + + hScrollBarRect = bounds; + hScrollBarRect.top = hScrollBarRect.bottom - B_H_SCROLL_BAR_HEIGHT; + hScrollBarRect.right -= B_V_SCROLL_BAR_WIDTH; + + // Adjust stuff so the border will fit. + if (fBorderStyle == B_PLAIN_BORDER) { + titleRect.InsetBy(1, 0); + titleRect.top++; + outlineRect.InsetBy(1, 0); + outlineRect.bottom--; + + vScrollBarRect.OffsetBy(-1, 0); + vScrollBarRect.InsetBy(0, 1); + hScrollBarRect.OffsetBy(0, -1); + hScrollBarRect.InsetBy(1, 0); + } else if (fBorderStyle == B_FANCY_BORDER) { + titleRect.InsetBy(2, 0); + titleRect.top += 2; + outlineRect.InsetBy(2, 0); + outlineRect.bottom -= 2; + + vScrollBarRect.OffsetBy(-2, 0); + vScrollBarRect.InsetBy(0, 2); + hScrollBarRect.OffsetBy(0, -2); + hScrollBarRect.InsetBy(2, 0); + } +} + + // #pragma mark - @@ -4553,83 +4738,3 @@ RecursiveOutlineIterator::CurrentLevel() const } -void -BColumnListView::_Init(bool showHorizontalScrollbar) -{ - SetViewColor(B_TRANSPARENT_32_BIT); - - BRect bounds(Bounds()); - - for (int i = 0; i < (int)B_COLOR_TOTAL; i++) - fColorList[i] = kColor[i]; - - BRect titleRect(bounds); - titleRect.bottom = titleRect.top + kTitleHeight; -#if !LOWER_SCROLLBAR - titleRect.right -= B_V_SCROLL_BAR_WIDTH + 1; -#endif - - BRect outlineRect(bounds); - outlineRect.top = titleRect.bottom + 1.0; - outlineRect.right -= B_V_SCROLL_BAR_WIDTH + 1; - if (showHorizontalScrollbar) - outlineRect.bottom -= B_H_SCROLL_BAR_HEIGHT + 1; - - BRect vScrollBarRect(bounds); -#if LOWER_SCROLLBAR - vScrollBarRect.top += kTitleHeight; -#endif - - vScrollBarRect.left = vScrollBarRect.right - B_V_SCROLL_BAR_WIDTH; - if (showHorizontalScrollbar) - vScrollBarRect.bottom -= B_H_SCROLL_BAR_HEIGHT; - - BRect hScrollBarRect(bounds); - hScrollBarRect.top = hScrollBarRect.bottom - B_H_SCROLL_BAR_HEIGHT; - hScrollBarRect.right -= B_V_SCROLL_BAR_WIDTH; - - // Adjust stuff so the border will fit. - if (fBorderStyle == B_PLAIN_BORDER) { - titleRect.InsetBy(1, 0); - titleRect.top++; - outlineRect.InsetBy(1, 0); - outlineRect.bottom--; - - vScrollBarRect.OffsetBy(-1, 0); - vScrollBarRect.InsetBy(0, 1); - hScrollBarRect.OffsetBy(0, -1); - hScrollBarRect.InsetBy(1, 0); - } else if (fBorderStyle == B_FANCY_BORDER) { - titleRect.InsetBy(2, 0); - titleRect.top += 2; - outlineRect.InsetBy(2, 0); - outlineRect.bottom -= 2; - - vScrollBarRect.OffsetBy(-2, 0); - vScrollBarRect.InsetBy(0, 2); - hScrollBarRect.OffsetBy(0, -2); - hScrollBarRect.InsetBy(2, 0); - } - - fOutlineView = new OutlineView(outlineRect, &fColumns, &fSortColumns, this); - AddChild(fOutlineView); - - - fTitleView = new TitleView(titleRect, fOutlineView, &fColumns, - &fSortColumns, this, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); - AddChild(fTitleView); - - fVerticalScrollBar = new BScrollBar(vScrollBarRect, "vertical_scroll_bar", - fOutlineView, 0.0, bounds.Height(), B_VERTICAL); - AddChild(fVerticalScrollBar); - - fHorizontalScrollBar = new BScrollBar(hScrollBarRect, - "horizontal_scroll_bar", fTitleView, 0.0, bounds.Width(), B_HORIZONTAL); - AddChild(fHorizontalScrollBar); - - if (!showHorizontalScrollbar) - fHorizontalScrollBar->Hide(); - - fOutlineView->FixScrollBar(true); -} -