diff --git a/headers/os/interface/Menu.h b/headers/os/interface/Menu.h index ba2289b03a..3dc164455c 100644 --- a/headers/os/interface/Menu.h +++ b/headers/os/interface/Menu.h @@ -21,8 +21,10 @@ class BMenuItem; class BMenuBar; -class BMenuWindow; -class BMenuFrame; + +namespace BPrivate { + class BMenuWindow; +} class _ExtraMenuData_; @@ -210,7 +212,7 @@ virtual void _ReservedMenu6(); bool OverSuper(BPoint loc); bool OverSubmenu(BMenuItem *item, BPoint loc); - BMenuWindow *MenuWindow(); + BPrivate::BMenuWindow* MenuWindow(); void DeleteMenuWindow(); BMenuItem *HitTestItems(BPoint where, BPoint slop = B_ORIGIN) const; BRect Superbounds() const; @@ -265,7 +267,7 @@ static bool sAltAsCommandKey; BList fItems; BRect fPad; BMenuItem *fSelected; - BMenuWindow *fCachedMenuWindow; + BPrivate::BMenuWindow* fCachedMenuWindow; BMenu *fSuper; BMenuItem *fSuperitem; BRect fSuperbounds; diff --git a/headers/private/interface/MenuWindow.h b/headers/private/interface/MenuWindow.h index c8efdb449b..3c19fbf2eb 100644 --- a/headers/private/interface/MenuWindow.h +++ b/headers/private/interface/MenuWindow.h @@ -1,72 +1,24 @@ -//------------------------------------------------------------------------------ -// Copyright (c) 2003-2004, Haiku, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// -// File Name: MenuWindow.h -// Authors: Marc Flerackers (mflerackers@androme.be) -// Stefano Ceccherini (burton666@libero.it) -// Description: BMenuWindow is the custom BWindow for menus. -//------------------------------------------------------------------------------ +/* + * Copyright 2001-2006, Haiku, Inc. + * Distributed under the terms of the MIT License. + * + * Authors: + * Marc Flerackers (mflerackers@androme.be) + * Stefano Ceccherini (burton666@libero.it) + */ #ifndef __MENUWINDOW_H #define __MENUWINDOW_H + #include class BMenu; -class BMenuScroller : public BView { - public: - BMenuScroller(BRect frame, BMenu *menu); - virtual ~BMenuScroller(); - - virtual void Pulse(); - virtual void Draw(BRect updateRect); - - private: - BMenu *fMenu; - BRect fUpperButton; - BRect fLowerButton; - - float fValue; - float fLimit; - - bool fUpperEnabled; - bool fLowerEnabled; - - uint32 fButton; - BPoint fPosition; -}; -class BMenuFrame : public BView { - public: - BMenuFrame(BMenu *menu); +namespace BPrivate { - virtual void AttachedToWindow(); - virtual void DetachedFromWindow(); - virtual void Draw(BRect updateRect); - - private: - friend class BMenuWindow; - - BMenu *fMenu; -}; +class BMenuFrame; +class BMenuScroller; class BMenuWindow : public BWindow { @@ -85,4 +37,6 @@ class BMenuWindow : public BWindow { BMenuFrame *fMenuFrame; }; -#endif +} // namespace BPrivate + +#endif // __MENUWINDOW_H diff --git a/src/kits/interface/Menu.cpp b/src/kits/interface/Menu.cpp index 53ad3c9ea5..182719155a 100644 --- a/src/kits/interface/Menu.cpp +++ b/src/kits/interface/Menu.cpp @@ -28,6 +28,8 @@ #include using std::nothrow; +using BPrivate::BMenuWindow; + class _ExtraMenuData_ { public: diff --git a/src/kits/interface/MenuWindow.cpp b/src/kits/interface/MenuWindow.cpp index 36f788677c..53d706dbbe 100644 --- a/src/kits/interface/MenuWindow.cpp +++ b/src/kits/interface/MenuWindow.cpp @@ -5,7 +5,6 @@ * Authors: * Marc Flerackers (mflerackers@androme.be) * Stefano Ceccherini (burton666@libero.it) - * */ //! BMenuWindow is a custom BWindow for BMenus. @@ -17,12 +16,58 @@ #include +namespace BPrivate { + +class BMenuScroller : public BView { + public: + BMenuScroller(BRect frame, BMenu *menu); + virtual ~BMenuScroller(); + + virtual void Pulse(); + virtual void Draw(BRect updateRect); + + private: + BMenu *fMenu; + BRect fUpperButton; + BRect fLowerButton; + + float fValue; + float fLimit; + + bool fUpperEnabled; + bool fLowerEnabled; + + uint32 fButton; + BPoint fPosition; +}; + +class BMenuFrame : public BView { + public: + BMenuFrame(BMenu *menu); + virtual ~BMenuFrame(); + + virtual void AttachedToWindow(); + virtual void DetachedFromWindow(); + virtual void Draw(BRect updateRect); + + private: + friend class BMenuWindow; + + BMenu *fMenu; +}; + +} // namespace BPrivate + +using namespace BPrivate; + + const int kScrollerHeight = 10; const int kScrollStep = 16; + BMenuScroller::BMenuScroller(BRect frame, BMenu *menu) - : BView(frame, "menu scroller", 0, B_WILL_DRAW | B_FRAME_EVENTS - | B_PULSE_NEEDED), + : BView(frame, "menu scroller", 0, + B_WILL_DRAW | B_FRAME_EVENTS | B_PULSE_NEEDED), fMenu(menu), fUpperButton(0, 0, frame.right, kScrollerHeight), fLowerButton(0, frame.bottom - kScrollerHeight, frame.right, frame.bottom), @@ -136,6 +181,77 @@ BMenuScroller::Draw(BRect updateRect) // #pragma mark - +BMenuFrame::BMenuFrame(BMenu *menu) + : BView(BRect(0, 0, 1, 1), "menu frame", B_FOLLOW_ALL_SIDES, B_WILL_DRAW), + fMenu(menu) +{ +} + + +BMenuFrame::~BMenuFrame() +{ +} + + +void +BMenuFrame::AttachedToWindow() +{ + BView::AttachedToWindow(); + + if (fMenu != NULL) + AddChild(fMenu); + + ResizeTo(Window()->Bounds().Width(), Window()->Bounds().Height()); + if (fMenu != NULL) { + BFont font; + fMenu->GetFont(&font); + SetFont(&font); + } +} + + +void +BMenuFrame::DetachedFromWindow() +{ + if (fMenu != NULL) + RemoveChild(fMenu); +} + + +void +BMenuFrame::Draw(BRect updateRect) +{ + if (fMenu != NULL && fMenu->CountItems() == 0) { + // TODO: Review this as it's a bit hacky. + // Menu has a size of 0, 0, since there are no items in it. + // So the BMenuFrame class has to fake it and draw an empty item. + // Note that we can't add a real "empty" item because then we couldn't + // tell if the item was added by us or not. + // See also BMenu::UpdateWindowViewSize() + SetHighColor(ui_color(B_MENU_BACKGROUND_COLOR)); + SetLowColor(HighColor()); + FillRect(updateRect); + + font_height height; + GetFontHeight(&height); + SetHighColor(tint_color(ui_color(B_MENU_BACKGROUND_COLOR), B_DISABLED_LABEL_TINT)); + BPoint where((Bounds().Width() - fMenu->StringWidth(kEmptyMenuLabel)) / 2, ceilf(height.ascent + 1)); + DrawString(kEmptyMenuLabel, where); + } + + SetHighColor(tint_color(ui_color(B_MENU_BACKGROUND_COLOR), B_DARKEN_2_TINT)); + BRect bounds(Bounds()); + + StrokeLine(BPoint(bounds.right, bounds.top), + BPoint(bounds.right, bounds.bottom - 1)); + StrokeLine(BPoint(bounds.left + 1, bounds.bottom), + BPoint(bounds.right, bounds.bottom)); +} + + +// #pragma mark - + + BMenuWindow::BMenuWindow(const char *name) // The window will be resized by BMenu, so just pass a dummy rect : BWindow(BRect(0, 0, 0, 0), name, B_BORDERED_WINDOW_LOOK, kMenuWindowFeel, @@ -216,69 +332,3 @@ BMenuWindow::DetachScrollers() delete fScroller; fScroller = NULL; } - - -// #pragma mark - - - -BMenuFrame::BMenuFrame(BMenu *menu) - : BView(BRect(0, 0, 1, 1), "menu frame", B_FOLLOW_ALL_SIDES, B_WILL_DRAW), - fMenu(menu) -{ -} - - -void -BMenuFrame::AttachedToWindow() -{ - BView::AttachedToWindow(); - - if (fMenu != NULL) - AddChild(fMenu); - - ResizeTo(Window()->Bounds().Width(), Window()->Bounds().Height()); - if (fMenu != NULL) { - BFont font; - fMenu->GetFont(&font); - SetFont(&font); - } -} - - -void -BMenuFrame::DetachedFromWindow() -{ - if (fMenu != NULL) - RemoveChild(fMenu); -} - - -void -BMenuFrame::Draw(BRect updateRect) -{ - if (fMenu != NULL && fMenu->CountItems() == 0) { - // TODO: Review this as it's a bit hacky. - // Menu has a size of 0, 0, since there are no items in it. - // So the BMenuFrame class has to fake it and draw an empty item. - // Note that we can't add a real "empty" item because then we couldn't - // tell if the item was added by us or not. - // See also BMenu::UpdateWindowViewSize() - SetHighColor(ui_color(B_MENU_BACKGROUND_COLOR)); - SetLowColor(HighColor()); - FillRect(updateRect); - - font_height height; - GetFontHeight(&height); - SetHighColor(tint_color(ui_color(B_MENU_BACKGROUND_COLOR), B_DISABLED_LABEL_TINT)); - BPoint where((Bounds().Width() - fMenu->StringWidth(kEmptyMenuLabel)) / 2, ceilf(height.ascent + 1)); - DrawString(kEmptyMenuLabel, where); - } - - SetHighColor(tint_color(ui_color(B_MENU_BACKGROUND_COLOR), B_DARKEN_2_TINT)); - BRect bounds(Bounds()); - - StrokeLine(BPoint(bounds.right, bounds.top), - BPoint(bounds.right, bounds.bottom - 1)); - StrokeLine(BPoint(bounds.left + 1, bounds.bottom), - BPoint(bounds.right, bounds.bottom)); -}