#include <Button.h>
#include <Screen.h>
#include "OverrideAlert.h"
OverrideAlert::OverrideAlert(const char* title, const char* text,
const char* button1, uint32 modifiers1,
const char* button2, uint32 modifiers2,
const char* button3, uint32 modifiers3,
button_width width, alert_type type)
:
BAlert(title, text, button1, button2, button3, width, type),
fCurModifiers(0)
{
fButtonModifiers[0] = modifiers1;
fButtonModifiers[1] = modifiers2;
fButtonModifiers[2] = modifiers3;
UpdateButtons(modifiers(), true);
BPoint where = OverPosition(Frame().Width(), Frame().Height());
MoveTo(where.x, where.y);
}
OverrideAlert::OverrideAlert(const char* title, const char* text,
const char* button1, uint32 modifiers1,
const char* button2, uint32 modifiers2,
const char* button3, uint32 modifiers3,
button_width width, button_spacing spacing, alert_type type)
:
BAlert(title, text, button1, button2, button3, width, spacing, type),
fCurModifiers(0)
{
fButtonModifiers[0] = modifiers1;
fButtonModifiers[1] = modifiers2;
fButtonModifiers[2] = modifiers3;
UpdateButtons(modifiers(), true);
BPoint where = OverPosition(Frame().Width(), Frame().Height());
MoveTo(where.x, where.y);
}
OverrideAlert::~OverrideAlert()
{
}
void
OverrideAlert::DispatchMessage(BMessage* message, BHandler* handler)
{
if (message->what == B_KEY_DOWN || message->what == B_KEY_UP
|| message->what == B_UNMAPPED_KEY_DOWN
|| message->what == B_UNMAPPED_KEY_UP) {
uint32 modifiers;
if (message->FindInt32("modifiers", (int32*)&modifiers) == B_OK)
UpdateButtons(modifiers);
}
BAlert::DispatchMessage(message, handler);
}
BPoint
OverrideAlert::OverPosition(float width, float height)
{
BWindow* window
= dynamic_cast<BWindow*>(BLooper::LooperForThread(find_thread(NULL)));
BRect desirableRect;
if (window != NULL) {
desirableRect = window->Frame();
float midX = (desirableRect.left + desirableRect.right) / 2.0f;
float midY = (desirableRect.top * 3.0f + desirableRect.bottom) / 4.0f;
desirableRect.left = midX - ceilf(width / 2.0f);
desirableRect.right = desirableRect.left+width;
desirableRect.top = midY - ceilf(height / 3.0f);
desirableRect.bottom = desirableRect.top + height;
} else {
desirableRect = BScreen().Frame();
float midX = (desirableRect.left + desirableRect.right) / 2.0f;
float midY = (desirableRect.top * 3.0f + desirableRect.bottom) / 4.0f;
desirableRect.left = midX - ceilf(width / 2.0f);
desirableRect.right = desirableRect.left + width;
desirableRect.top = midY - ceilf(height / 3.0f);
desirableRect.bottom = desirableRect.top + height;
}
return desirableRect.LeftTop();
}
void
OverrideAlert::UpdateButtons(uint32 modifiers, bool force)
{
if (modifiers == fCurModifiers && !force)
return;
fCurModifiers = modifiers;
for (int32 i = 0; i < 3; i++) {
BButton* button = ButtonAt(i);
if (button != NULL) {
button->SetEnabled(((fButtonModifiers[i] & fCurModifiers)
== fButtonModifiers[i]));
}
}
}