#include "ShowHideMenuItem.h"
#include <Debug.h>
#include <Roster.h>
#include <WindowInfo.h>
#include "WindowMenuItem.h"
#include "tracker_private.h"
const float kHPad = 10.0f;
const float kVPad = 2.0f;
TShowHideMenuItem::TShowHideMenuItem(const char* title, const BList* teams,
uint32 action)
:
BMenuItem(title, NULL),
fTeams(teams),
fAction(action)
{
menu_info info;
get_menu_info(&info);
BFont menuFont;
menuFont.SetFamilyAndStyle(info.f_family, info.f_style);
menuFont.SetSize(info.font_size);
fTitleWidth = ceilf(menuFont.StringWidth(title));
font_height fontHeight;
menuFont.GetHeight(&fontHeight);
fTitleAscent = ceilf(fontHeight.ascent);
fTitleDescent = ceilf(fontHeight.descent + fontHeight.leading);
}
void
TShowHideMenuItem::GetContentSize(float* width, float* height)
{
*width = kHPad + fTitleWidth + kHPad;
*height = fTitleAscent + fTitleDescent;
*height += kVPad * 2;
}
void
TShowHideMenuItem::DrawContent()
{
BRect frame(Frame());
float labelHeight = fTitleAscent + fTitleDescent;
BPoint drawLoc;
drawLoc.x = kHPad;
drawLoc.y = ((frame.Height() - labelHeight) / 2);
Menu()->MovePenBy(drawLoc.x, drawLoc.y);
BMenuItem::DrawContent();
}
status_t
TShowHideMenuItem::Invoke(BMessage*)
{
bool doZoom = false;
BRect zoomRect(0, 0, 0, 0);
BMenuItem* item = Menu()->Superitem();
if (item->Menu()->Window() != NULL) {
zoomRect = item->Menu()->ConvertToScreen(item->Frame());
doZoom = true;
}
return TeamShowHideCommon(static_cast<int32>(fAction), fTeams, zoomRect,
doZoom);
}
status_t
TShowHideMenuItem::TeamShowHideCommon(int32 action, const BList* teamList,
BRect zoomRect, bool doZoom)
{
if (teamList == NULL)
return B_BAD_VALUE;
for (int32 i = teamList->CountItems() - 1; i >= 0; i--) {
team_id team = (addr_t)teamList->ItemAt(i);
switch (action) {
case B_MINIMIZE_WINDOW:
do_minimize_team(zoomRect, team, doZoom && i == 0);
break;
case B_BRING_TO_FRONT:
do_bring_to_front_team(zoomRect, team, doZoom && i == 0);
break;
case B_QUIT_REQUESTED:
{
BMessenger messenger((char*)NULL, team);
uint32 command = B_QUIT_REQUESTED;
app_info aInfo;
be_roster->GetRunningAppInfo(team, &aInfo);
if (strcasecmp(aInfo.signature, kTrackerSignature) == 0)
command = 'Tall';
messenger.SendMessage(command);
break;
}
}
}
return B_OK;
}