Moved BMenuWindow, BMenuFrame, and BMenuScroller into the BPrivate namespace.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19360 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2006-11-22 11:52:18 +00:00
parent aa389c6b38
commit 2628e60cbc
4 changed files with 142 additions and 134 deletions

View File

@ -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;

View File

@ -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 <Window.h>
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

View File

@ -28,6 +28,8 @@
#include <ServerProtocol.h>
using std::nothrow;
using BPrivate::BMenuWindow;
class _ExtraMenuData_ {
public:

View File

@ -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 <WindowPrivate.h>
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));
}