1/* 2 * Copyright (c) 2007, Haiku, Inc. 3 * Distributed under the terms of the MIT license. 4 * 5 * Author: 6 * ��ukasz 'Sil2100' Zemczak <sil2100@vexillium.org> 7 */ 8 9 10#include "PackageStatus.h" 11 12#include <Autolock.h> 13#include <Catalog.h> 14#include <GroupLayout.h> 15#include <LayoutBuilder.h> 16#include <Locale.h> 17 18#include <stdio.h> 19#include <string.h> 20 21#undef B_TRANSLATION_CONTEXT 22#define B_TRANSLATION_CONTEXT "PackageStatus" 23 24StopButton::StopButton() 25 : 26 BButton(BRect(0, 0, 22, 18), "stop", B_TRANSLATE("Stop"), 27 new BMessage(P_MSG_STOP)) 28{ 29} 30 31 32void 33StopButton::Draw(BRect updateRect) 34{ 35 BButton::Draw(updateRect); 36 37 updateRect = Bounds(); 38 updateRect.InsetBy((updateRect.Width() - 4) / 2, 39 (updateRect.Height() - 4) / 2); 40 //updateRect.InsetBy(9, 7); 41 SetHighColor(0, 0, 0); 42 FillRect(updateRect); 43} 44 45 46// #pragma mark - 47 48 49PackageStatus::PackageStatus(const char *title, const char *label, 50 const char *trailing, BHandler *parent) 51 : 52 BWindow(BRect(200, 200, 550, 255), title, B_TITLED_WINDOW, 53 B_NOT_CLOSABLE | B_NOT_RESIZABLE | B_NOT_ZOOMABLE, 0), 54 fIsStopped(false), 55 fParent(parent) 56{ 57 fStatus = new BStatusBar("status_bar", B_TRANSLATE("Installing package")); 58 fStatus->SetBarHeight(12); 59 60 fButton = new StopButton(); 61 fButton->SetExplicitMaxSize(BSize(22, 18)); 62 63 BLayoutBuilder::Group<>(this, B_HORIZONTAL, 0) 64 .AddStrut(5.0f) 65 .Add(fStatus) 66 .Add(fButton); 67 68 fButton->SetTarget(this); 69 Run(); 70} 71 72 73PackageStatus::~PackageStatus() 74{ 75} 76 77 78void 79PackageStatus::MessageReceived(BMessage *msg) 80{ 81 switch (msg->what) { 82 case P_MSG_STOP: 83 fIsStopped = true; 84 if (fParent != NULL) { 85 // If we have a parent defined, forward this message 86 BLooper *loop = fParent->Looper(); 87 if (loop != NULL) { 88 loop->PostMessage(msg, fParent); 89 } 90 } 91 break; 92 default: 93 BWindow::MessageReceived(msg); 94 } 95} 96 97 98void 99PackageStatus::Reset(uint32 stages, const char *label, const char *trailing) 100{ 101 BAutolock lock(this); 102 103 if (lock.IsLocked()) { 104 fStatus->Reset(label, trailing); 105 fStatus->SetMaxValue(stages); 106 fIsStopped = false; 107 } 108} 109 110 111void 112PackageStatus::StageStep(uint32 count, const char *text, const char *trailing) 113{ 114 BAutolock lock(this); 115 116 if (lock.IsLocked()) { 117 fStatus->Update(count, text, trailing); 118 } 119} 120 121 122bool 123PackageStatus::Stopped() 124{ 125 BAutolock lock(this); 126 return fIsStopped; 127} 128 129