#include "BarMenuTitle.h"
#include <Bitmap.h>
#include <ControlLook.h>
#include <Debug.h>
#include <Region.h>
#include "BarApp.h"
#include "BarView.h"
#include "BarWindow.h"
#include "DeskbarMenu.h"
TBarMenuTitle::TBarMenuTitle(float width, float height, const BBitmap* icon,
BMenu* menu, TBarView* barView)
:
BMenuItem(menu, new BMessage(B_REFS_RECEIVED)),
fWidth(width),
fHeight(height),
fIcon(icon),
fMenu(menu),
fBarView(barView),
fInitStatus(B_NO_INIT)
{
if (fIcon == NULL || fMenu == NULL || fBarView == NULL)
fInitStatus = B_BAD_VALUE;
else
fInitStatus = B_OK;
}
TBarMenuTitle::~TBarMenuTitle()
{
}
void
TBarMenuTitle::SetContentSize(float width, float height)
{
fWidth = width;
fHeight = height;
}
void
TBarMenuTitle::GetContentSize(float* width, float* height)
{
*width = fWidth;
*height = fHeight;
}
void
TBarMenuTitle::Draw()
{
BMenu* menu = Menu();
if (fInitStatus != B_OK || menu == NULL)
return;
BRect frame(Frame());
rgb_color base = ui_color(B_MENU_BACKGROUND_COLOR);
menu->PushState();
BRect windowBounds = menu->Window()->Bounds();
if (frame.right > windowBounds.right)
frame.right = windowBounds.right;
if (IsSelected()) {
be_control_look->DrawMenuItemBackground(menu, frame, frame, base,
BControlLook::B_ACTIVATED);
} else
be_control_look->DrawButtonBackground(menu, frame, frame, base);
menu->MovePenTo(ContentLocation());
DrawContent();
menu->PopState();
}
void
TBarMenuTitle::DrawContent()
{
if (fInitStatus != B_OK)
return;
BMenu* menu = Menu();
if (menu == NULL)
return;
menu->SetDrawingMode(B_OP_ALPHA);
const BRect frame(Frame());
BRect iconRect(fIcon->Bounds().OffsetToCopy(frame.LeftTop()));
float widthOffset = rintf((frame.Width() - iconRect.Width()) / 2);
float heightOffset = rintf((frame.Height() - iconRect.Height()) / 2);
bool isLeafMenu = dynamic_cast<TDeskbarMenu*>(fMenu) != NULL;
if (isLeafMenu)
iconRect.OffsetBy(widthOffset, frame.Height() - iconRect.Height() + 2);
else
iconRect.OffsetBy(widthOffset, heightOffset);
if (iconRect.Width() > frame.Width()) {
float diff = iconRect.Width() - frame.Width();
BRect mask(iconRect.InsetByCopy(floorf(diff / 2), 0));
BRegion clipping(mask);
menu->ConstrainClippingRegion(&clipping);
}
menu->DrawBitmapAsync(fIcon, iconRect);
menu->ConstrainClippingRegion(NULL);
}
status_t
TBarMenuTitle::Invoke(BMessage* message)
{
if (fInitStatus != B_OK || fBarView == NULL)
return fInitStatus;
BLooper* looper = fBarView->Looper();
if (looper->Lock()) {
fBarView->HandleDeskbarMenu(NULL);
looper->Unlock();
}
return BMenuItem::Invoke(message);
}