#ifndef _STATUS_WINDOW_H
#define _STATUS_WINDOW_H
#include <Bitmap.h>
#include <ObjectList.h>
#include <StatusBar.h>
#include <String.h>
#include <View.h>
#include <Window.h>
namespace BPrivate {
enum StatusWindowState {
kCopyState,
kMoveState,
kDeleteState,
kTrashState,
kVolumeState,
kCreateLinkState,
kRestoreFromTrashState
};
class BStatusView;
class BStatusWindow : public BWindow {
public:
BStatusWindow();
virtual ~BStatusWindow();
void CreateStatusItem(thread_id,
StatusWindowState);
void InitStatusItem(thread_id, int32 totalItems,
off_t totalSize,
const entry_ref* destDir = NULL,
bool showCount = true);
void UpdateStatus(thread_id, const char* curItem,
off_t itemSize, bool optional = false);
void RemoveStatusItem(thread_id);
bool CheckCanceledOrPaused(thread_id);
bool AttemptToQuit();
protected:
virtual void WindowActivated(bool state);
private:
BObjectList<BStatusView> fViewList;
BMessageFilter* fMouseDownFilter;
bool fRetainDesktopFocus;
typedef BWindow _inherited;
};
class BStatusView : public BView {
public:
BStatusView(BRect frame, thread_id,
StatusWindowState state);
virtual ~BStatusView();
void Init();
void InitStatus(int32 totalItems, off_t totalSize,
const entry_ref* destDir, bool showCount);
virtual void Draw(BRect updateRect);
virtual void AttachedToWindow();
virtual void MessageReceived(BMessage* message);
void UpdateStatus(const char* currentItem,
off_t itemSize, bool optional = false);
bool WasCanceled() const;
bool IsPaused() const;
thread_id Thread() const;
void SetWasCanceled();
private:
BString _DestinationString(float* _width);
BString _StatusString(float availableSpace,
float fontSize, float* _width);
BString _SpeedStatusString(float availableSpace,
float* _width);
BString _FullSpeedString();
BString _ShortSpeedString();
BString _TimeStatusString(float availableSpace,
float* _width);
BString _ShortTimeRemainingString(const char* timeText);
BString _FullTimeRemainingString(time_t now,
time_t finishTime, const char* timeText);
BStatusBar* fStatusBar;
off_t fTotalSize;
off_t fItemSize;
off_t fSizeProcessed;
off_t fLastSpeedReferenceSize;
off_t fEstimatedFinishReferenceSize;
int32 fCurItem;
int32 fType;
BBitmap* fBitmap;
BButton* fStopButton;
BButton* fPauseButton;
thread_id fThread;
bigtime_t fLastUpdateTime;
bigtime_t fLastSpeedReferenceTime;
bigtime_t fProcessStartTime;
bigtime_t fLastSpeedUpdateTime;
bigtime_t fEstimatedFinishReferenceTime;
static const size_t kBytesPerSecondSlots = 10;
size_t fCurrentBytesPerSecondSlot;
double fBytesPerSecondSlot[kBytesPerSecondSlots];
double fBytesPerSecond;
bool fShowCount;
bool fWasCanceled;
bool fIsPaused;
BString fDestDir;
char fPendingStatusString[128];
typedef BView _inherited;
};
inline bool
BStatusView::IsPaused() const
{
return fIsPaused;
}
inline bool
BStatusView::WasCanceled() const
{
return fWasCanceled;
}
inline thread_id
BStatusView::Thread() const
{
return fThread;
}
extern BStatusWindow* gStatusWindow;
}
using namespace BPrivate;
#endif