* Copyright (c) 2007, Haiku, Inc.
* Distributed under the terms of the MIT license.
*
* Author:
* Łukasz 'Sil2100' Zemczak <sil2100@vexillium.org>
*/
#include "PackageStatus.h"
#include <Autolock.h>
#include <Catalog.h>
#include <GroupLayout.h>
#include <LayoutBuilder.h>
#include <Locale.h>
#include <stdio.h>
#include <string.h>
#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "PackageStatus"
StopButton::StopButton()
:
BButton(BRect(0, 0, 22, 18), "stop", B_TRANSLATE("Stop"),
new BMessage(P_MSG_STOP))
{
}
void
StopButton::Draw(BRect updateRect)
{
BButton::Draw(updateRect);
updateRect = Bounds();
updateRect.InsetBy((updateRect.Width() - 4) / 2,
(updateRect.Height() - 4) / 2);
SetHighColor(0, 0, 0);
FillRect(updateRect);
}
PackageStatus::PackageStatus(const char *title, const char *label,
const char *trailing, BHandler *parent)
:
BWindow(BRect(200, 200, 550, 255), title, B_TITLED_WINDOW,
B_NOT_CLOSABLE | B_NOT_RESIZABLE | B_NOT_ZOOMABLE, 0),
fIsStopped(false),
fParent(parent)
{
fStatus = new BStatusBar("status_bar", B_TRANSLATE("Installing package"));
fStatus->SetBarHeight(12);
fButton = new StopButton();
fButton->SetExplicitMaxSize(BSize(22, 18));
BLayoutBuilder::Group<>(this, B_HORIZONTAL, 0)
.AddStrut(5.0f)
.Add(fStatus)
.Add(fButton);
fButton->SetTarget(this);
Run();
}
PackageStatus::~PackageStatus()
{
}
void
PackageStatus::MessageReceived(BMessage *msg)
{
switch (msg->what) {
case P_MSG_STOP:
fIsStopped = true;
if (fParent != NULL) {
BLooper *loop = fParent->Looper();
if (loop != NULL) {
loop->PostMessage(msg, fParent);
}
}
break;
default:
BWindow::MessageReceived(msg);
}
}
void
PackageStatus::Reset(uint32 stages, const char *label, const char *trailing)
{
BAutolock lock(this);
if (lock.IsLocked()) {
fStatus->Reset(label, trailing);
fStatus->SetMaxValue(stages);
fIsStopped = false;
}
}
void
PackageStatus::StageStep(uint32 count, const char *text, const char *trailing)
{
BAutolock lock(this);
if (lock.IsLocked()) {
fStatus->Update(count, text, trailing);
}
}
bool
PackageStatus::Stopped()
{
BAutolock lock(this);
return fIsStopped;
}