From 61b3e949b47aadb764d87142059678978b00b61c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Wed, 28 Sep 2005 16:15:02 +0000 Subject: [PATCH] more copy loop control methods added a size view git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14268 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../installer/InstallerCopyLoopControl.cpp | 71 ++++++++++++++++++- src/apps/installer/InstallerCopyLoopControl.h | 25 ++++++- src/apps/installer/InstallerWindow.cpp | 20 +++++- src/apps/installer/InstallerWindow.h | 1 + src/apps/installer/PackageViews.cpp | 43 +++++++---- src/apps/installer/PackageViews.h | 3 +- 6 files changed, 141 insertions(+), 22 deletions(-) diff --git a/src/apps/installer/InstallerCopyLoopControl.cpp b/src/apps/installer/InstallerCopyLoopControl.cpp index e9c9ccb482..4aa6790ac4 100644 --- a/src/apps/installer/InstallerCopyLoopControl.cpp +++ b/src/apps/installer/InstallerCopyLoopControl.cpp @@ -5,8 +5,9 @@ */ #include "InstallerCopyLoopControl.h" -InstallerCopyLoopControl::InstallerCopyLoopControl() - : CopyLoopControl() +InstallerCopyLoopControl::InstallerCopyLoopControl(InstallerWindow *window) + : CopyLoopControl(), + fWindow(window) { } @@ -14,3 +15,69 @@ InstallerCopyLoopControl::InstallerCopyLoopControl() InstallerCopyLoopControl::~InstallerCopyLoopControl(void) { } + + +bool +InstallerCopyLoopControl::FileError(const char *message, const char *name, status_t error, + bool allowContinue) +{ + return false; +} + + +void +InstallerCopyLoopControl::UpdateStatus(const char *name, entry_ref ref, int32 count, + bool optional) +{ +} + + +bool +InstallerCopyLoopControl::CheckUserCanceled() +{ + return false; +} + + +InstallerCopyLoopControl::OverwriteMode +InstallerCopyLoopControl::OverwriteOnConflict(const BEntry *srcEntry, + const char *destName, const BDirectory *destDir, bool srcIsDir, + bool dstIsDir) +{ + return kReplace; +} + + +bool +InstallerCopyLoopControl::SkipEntry(const BEntry *, bool file) +{ + return false; +} + + +void +InstallerCopyLoopControl::ChecksumChunk(const char *block, size_t size) +{ +} + + +bool +InstallerCopyLoopControl::ChecksumFile(const entry_ref *ref) +{ + return true; +} + + +bool +InstallerCopyLoopControl::SkipAttribute(const char *attributeName) +{ + return false; +} + + +bool +InstallerCopyLoopControl::PreserveAttribute(const char *attributeName) +{ + return false; +} + diff --git a/src/apps/installer/InstallerCopyLoopControl.h b/src/apps/installer/InstallerCopyLoopControl.h index 319d4786c8..f6640f5be8 100644 --- a/src/apps/installer/InstallerCopyLoopControl.h +++ b/src/apps/installer/InstallerCopyLoopControl.h @@ -8,14 +8,35 @@ #define _INSTALLERCOPYLOOPCONTROL_H #include "FSUtils.h" +#include "InstallerWindow.h" class InstallerCopyLoopControl : public CopyLoopControl { public: - InstallerCopyLoopControl(); - ~InstallerCopyLoopControl(void); + InstallerCopyLoopControl(InstallerWindow *window); + ~InstallerCopyLoopControl(void); + + virtual bool FileError(const char *message, const char *name, status_t error, + bool allowContinue); + + virtual void UpdateStatus(const char *name, entry_ref ref, int32 count, + bool optional = false); + + virtual bool CheckUserCanceled(); + + virtual OverwriteMode OverwriteOnConflict(const BEntry *srcEntry, + const char *destName, const BDirectory *destDir, bool srcIsDir, + bool dstIsDir); + + virtual bool SkipEntry(const BEntry *, bool file); + + virtual void ChecksumChunk(const char *block, size_t size); + virtual bool ChecksumFile(const entry_ref *); + virtual bool SkipAttribute(const char *attributeName); + virtual bool PreserveAttribute(const char *attributeName); private: + InstallerWindow *fWindow; }; #endif diff --git a/src/apps/installer/InstallerWindow.cpp b/src/apps/installer/InstallerWindow.cpp index a433cbfb7a..e55ac7a549 100644 --- a/src/apps/installer/InstallerWindow.cpp +++ b/src/apps/installer/InstallerWindow.cpp @@ -24,6 +24,7 @@ const uint32 SETUP_MESSAGE = 'iSEP'; const uint32 START_SCAN = 'iSSC'; const uint32 SRC_PARTITION = 'iSPT'; const uint32 DST_PARTITION = 'iDPT'; +const uint32 PACKAGE_CHECKBOX = 'iPCB'; InstallerWindow::InstallerWindow(BRect frame_rect) : BWindow(frame_rect, "Installer", B_TITLED_WINDOW, B_NOT_ZOOMABLE | B_NOT_RESIZABLE), @@ -84,7 +85,14 @@ InstallerWindow::InstallerWindow(BRect frame_rect) fDestMenuField->SetDivider(70.0); fDestMenuField->SetAlignment(B_ALIGN_RIGHT); fBackBox->AddChild(fDestMenuField); - + + BRect sizeRect = fBackBox->Bounds(); + sizeRect.top = sizeRect.bottom - 15; + sizeRect.left = sizeRect.right - 100; + fSizeView = new BStringView(sizeRect, "size_view", "Disk space required : 0.0 KB"); + fSizeView->SetAlignment(B_ALIGN_RIGHT); + fBackBox->AddChild(fSizeView); + // finish creating window Show(); @@ -118,6 +126,14 @@ InstallerWindow::MessageReceived(BMessage *msg) case SETUP_MESSAGE: LaunchDriveSetup(); break; + case PACKAGE_CHECKBOX: { + char buffer[15]; + fPackagesView->GetTotalSizeAsString(buffer); + char string[255]; + sprintf(string, "Disk space required: %s", buffer); + fSizeView->SetText(string); + break; + } case B_SOME_APP_LAUNCHED: case B_SOME_APP_QUIT: { @@ -236,7 +252,7 @@ InstallerWindow::PublishPackages() } packages.SortItems(ComparePackages); - fPackagesView->AddPackages(packages); + fPackagesView->AddPackages(packages, new BMessage(PACKAGE_CHECKBOX)); } diff --git a/src/apps/installer/InstallerWindow.h b/src/apps/installer/InstallerWindow.h index afa80c2f5e..1ca2303de6 100644 --- a/src/apps/installer/InstallerWindow.h +++ b/src/apps/installer/InstallerWindow.h @@ -39,6 +39,7 @@ private: BMenuField* fSrcMenuField, *fDestMenuField; PackagesView *fPackagesView; BScrollView *fPackagesScrollView; + BStringView *fSizeView; }; #endif /* _InstallerWindow_h */ diff --git a/src/apps/installer/PackageViews.cpp b/src/apps/installer/PackageViews.cpp index 669d36ce4e..e458b0dd1d 100644 --- a/src/apps/installer/PackageViews.cpp +++ b/src/apps/installer/PackageViews.cpp @@ -13,6 +13,23 @@ #define ICON_ATTRIBUTE "INSTALLER PACKAGE: ICON" +static void +SizeAsString(int32 size, char *string) +{ + float kb = size / 1024.0; + if (kb < 1.0) { + sprintf(string, "%ld B", size); + return; + } + float mb = kb / 1024.0; + if (mb < 1.0) { + sprintf(string, "%3.1f KB", kb); + return; + } + sprintf(string, "%3.1f MB", mb); +} + + Package::Package() : Group(), fName(NULL), @@ -83,18 +100,7 @@ err: void Package::GetSizeAsString(char *string) { - float kb = fSize / 1024.0; - if (kb < 1.0) { - sprintf(string, "%ld B", fSize); - return; - } - float mb = kb / 1024.0; - if (mb < 1.0) { - sprintf(string, "%3.1f KB", kb); - return; - } - sprintf(string, "%3.1f MB", mb); - + SizeAsString(fSize, string); } @@ -126,7 +132,7 @@ void PackageCheckBox::Draw(BRect update) { BCheckBox::Draw(update); - char string[255]; + char string[15]; fPackage.GetSizeAsString(string); float width = StringWidth(string); DrawString(string, BPoint(Bounds().right - width - 8, 11)); @@ -152,7 +158,6 @@ GroupView::~GroupView() PackagesView::PackagesView(BRect rect, const char* name) : BView(rect, name, B_FOLLOW_ALL_SIDES, B_WILL_DRAW|B_FRAME_EVENTS) { - } @@ -170,7 +175,7 @@ PackagesView::Clean() void -PackagesView::AddPackages(BList &packages) +PackagesView::AddPackages(BList &packages, BMessage *msg) { int32 count = packages.CountItems(); BRect rect = Bounds(); @@ -193,6 +198,7 @@ PackagesView::AddPackages(BList &packages) PackageCheckBox *checkBox = new PackageCheckBox(rect, *package); checkBox->SetValue(package->OnByDefault() ? B_CONTROL_ON : B_CONTROL_OFF); checkBox->SetEnabled(!package->AlwaysOn()); + checkBox->SetMessage(msg); AddChild(checkBox); rect.OffsetBy(0, 20); } @@ -212,3 +218,10 @@ PackagesView::AddPackages(BList &packages) Invalidate(); } + + +void +PackagesView::GetTotalSizeAsString(char *string) +{ + SizeAsString(0, string); +} diff --git a/src/apps/installer/PackageViews.h b/src/apps/installer/PackageViews.h index 9bc5b5e5a4..ba6c401480 100644 --- a/src/apps/installer/PackageViews.h +++ b/src/apps/installer/PackageViews.h @@ -76,7 +76,8 @@ public: PackagesView(BRect rect, const char* name); virtual ~PackagesView(); void Clean(); - void AddPackages(BList &list); + void AddPackages(BList &list, BMessage *msg); + void GetTotalSizeAsString(char *string); private: BList fViews; };