diff --git a/src/apps/installer/CopyEngine.cpp b/src/apps/installer/CopyEngine.cpp index 6b24907a39..464614da71 100644 --- a/src/apps/installer/CopyEngine.cpp +++ b/src/apps/installer/CopyEngine.cpp @@ -53,7 +53,8 @@ private: CopyEngine::CopyEngine(InstallerWindow *window) : BLooper("copy_engine"), fWindow(window), - fPackages(NULL) + fPackages(NULL), + fSpaceRequired(0) { fControl = new InstallerCopyLoopControl(window); Run(); @@ -119,22 +120,35 @@ CopyEngine::Start(BMenu *srcMenu, BMenu *targetMenu) fprintf(stderr, "bad menu items\n"); return; } + + // check if target is initialized + // ask if init or mount as is BPath targetDirectory; BDiskDevice device; BPartition *partition; + BVolume targetVolume; + if (fDDRoster.GetPartitionWithID(targetItem->ID(), &device, &partition) == B_OK) { + if (partition->GetVolume(&targetVolume)!=B_OK) + return; if (partition->GetMountPoint(&targetDirectory)!=B_OK) return; } else if (fDDRoster.GetDeviceWithID(targetItem->ID(), &device) == B_OK) { + if (device.GetVolume(&targetVolume)!=B_OK) + return; if (device.GetMountPoint(&targetDirectory)!=B_OK) return; } else return; // shouldn't happen - // check if target is initialized - // ask if init or mount as is // check if target has enough space + if ((fSpaceRequired > 0 && targetVolume.FreeBytes() < fSpaceRequired) + && ((new BAlert("", "The destination disk may not have enough space. Try choosing a different disk or \ +choose to not install optional items.", "Try installing anyway", "Cancel", 0, + B_WIDTH_AS_USUAL, B_STOP_ALERT))->Go() != 0)) { + return; + } BPath srcDirectory; if (fDDRoster.GetPartitionWithID(srcItem->ID(), &device, &partition) == B_OK) { diff --git a/src/apps/installer/CopyEngine.h b/src/apps/installer/CopyEngine.h index 7d591b2142..a780b455cf 100644 --- a/src/apps/installer/CopyEngine.h +++ b/src/apps/installer/CopyEngine.h @@ -27,6 +27,7 @@ public: void Start(BMenu *srcMenu, BMenu *targetMenu); void ScanDisksPartitions(BMenu *srcMenu, BMenu *targetMenu); void SetPackagesList(BList *list); + void SetSpaceRequired(off_t bytes) { fSpaceRequired = bytes; }; private: void LaunchInitScript(BPath &path); void LaunchFinishScript(BPath &path); @@ -36,6 +37,7 @@ private: BDiskDeviceRoster fDDRoster; InstallerCopyLoopControl *fControl; BList *fPackages; + off_t fSpaceRequired; }; #endif /* _CopyEngine_h */ diff --git a/src/apps/installer/InstallerWindow.cpp b/src/apps/installer/InstallerWindow.cpp index 20492110f5..89c8627af1 100644 --- a/src/apps/installer/InstallerWindow.cpp +++ b/src/apps/installer/InstallerWindow.cpp @@ -136,7 +136,7 @@ InstallerWindow::InstallerWindow(BRect frame_rect) sizeRect.top = 105; sizeRect.bottom = sizeRect.top + 15; sizeRect.right -= 12; - sizeRect.left = sizeRect.right - be_plain_font->StringWidth("Disk space required: 0.0 KB") - 10; + sizeRect.left = sizeRect.right - be_plain_font->StringWidth("Disk space required: 0.0 KB") - 40; fSizeView = new BStringView(sizeRect, "size_view", "Disk space required: 0.0 KB", B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM); fSizeView->SetAlignment(B_ALIGN_RIGHT); fBackBox->AddChild(fSizeView); @@ -170,6 +170,7 @@ InstallerWindow::MessageReceived(BMessage *msg) int32 size = 0; fPackagesView->GetPackagesToInstall(list, &size); fCopyEngine->SetPackagesList(list); + fCopyEngine->SetSpaceRequired(size); BMessenger(fCopyEngine).SendMessage(ENGINE_START); DisableInterface(true); break; @@ -197,8 +198,11 @@ InstallerWindow::MessageReceived(BMessage *msg) } case STATUS_MESSAGE: { const char *status; - if (msg->FindString("status", &status) == B_OK) + if (msg->FindString("status", &status) == B_OK) { + fLastStatus = fStatusView->Text(); SetStatusMessage(status); + } else + SetStatusMessage(fLastStatus.String()); } case INSTALL_FINISHED: DisableInterface(false); diff --git a/src/apps/installer/InstallerWindow.h b/src/apps/installer/InstallerWindow.h index da825ace51..6f4710b32d 100644 --- a/src/apps/installer/InstallerWindow.h +++ b/src/apps/installer/InstallerWindow.h @@ -55,6 +55,7 @@ private: BBitmap *fLogo; BPoint fDrawPoint; CopyEngine *fCopyEngine; + BString fLastStatus; }; #endif /* _InstallerWindow_h */ diff --git a/src/apps/installer/PackageViews.cpp b/src/apps/installer/PackageViews.cpp index f4df47e182..31884ce674 100644 --- a/src/apps/installer/PackageViews.cpp +++ b/src/apps/installer/PackageViews.cpp @@ -6,11 +6,13 @@ #include #include #include +#include #include #include #include #include #include "PackageViews.h" +#include "InstallerWindow.h" #define ICON_ATTRIBUTE "INSTALLER PACKAGE: ICON" @@ -149,6 +151,22 @@ PackageCheckBox::Draw(BRect update) DrawBitmap(icon, BPoint(Bounds().right - 92, 0)); } + +void +PackageCheckBox::MouseMoved(BPoint point, uint32 transit, const BMessage *message) +{ + printf("coucouc\n"); + if (transit == B_ENTERED_VIEW) { + BMessage msg(STATUS_MESSAGE); + msg.AddString("status", fPackage->Description()); + BMessenger(NULL, Window()).SendMessage(&msg); + } else if (transit == B_EXITED_VIEW) { + BMessage msg(STATUS_MESSAGE); + BMessenger(NULL, Window()).SendMessage(&msg); + } +} + + GroupView::GroupView(BRect rect, Group *group) : BStringView(rect, "group", group->GroupName()), fGroup(group) diff --git a/src/apps/installer/PackageViews.h b/src/apps/installer/PackageViews.h index df70f4cced..6a9616926f 100644 --- a/src/apps/installer/PackageViews.h +++ b/src/apps/installer/PackageViews.h @@ -60,6 +60,7 @@ class PackageCheckBox : public BCheckBox { PackageCheckBox(BRect rect, Package *item); virtual ~PackageCheckBox(); virtual void Draw(BRect update); + virtual void MouseMoved(BPoint point, uint32 transit, const BMessage *message); Package *GetPackage() { return fPackage; }; private: Package *fPackage;