diff --git a/src/apps/installer/InstallerWindow.cpp b/src/apps/installer/InstallerWindow.cpp index aa8709a0b5..8cc0ea1e06 100644 --- a/src/apps/installer/InstallerWindow.cpp +++ b/src/apps/installer/InstallerWindow.cpp @@ -6,17 +6,22 @@ #include #include #include +#include +#include #include #include -#include #include #include "InstallerWindow.h" +#include "PartitionMenuItem.h" #define DRIVESETUP_SIG "application/x-vnd.Be-DRV$" const uint32 BEGIN_MESSAGE = 'iBGN'; const uint32 SHOW_BOTTOM_MESSAGE = 'iSBT'; const uint32 SETUP_MESSAGE = 'iSEP'; +const uint32 START_SCAN = 'iSSC'; +const uint32 SRC_PARTITION = 'iSPT'; +const uint32 DST_PARTITION = 'iDPT'; InstallerWindow::InstallerWindow(BRect frame_rect) : BWindow(frame_rect, "Installer", B_TITLED_WINDOW, B_NOT_ZOOMABLE | B_NOT_RESIZABLE), @@ -51,6 +56,12 @@ InstallerWindow::InstallerWindow(BRect frame_rect) fBackBox->AddChild(fSetupButton); fSetupButton->Hide(); + fPackagesView = new PackagesView(BRect(bounds.left+12, bounds.top+4, bounds.right-15-B_V_SCROLL_BAR_WIDTH, bounds.bottom-61), "packages_view"); + fPackagesScrollView = new BScrollView("packagesScroll", fPackagesView, B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, B_WILL_DRAW, + false, true); + fBackBox->AddChild(fPackagesScrollView); + fPackagesScrollView->Hide(); + fDrawButton = new DrawButton(BRect(bounds.left+12, bounds.bottom-33, bounds.left+100, bounds.bottom-20), "options_button", "Fewer options", "More options", new BMessage(SHOW_BOTTOM_MESSAGE)); fBackBox->AddChild(fDrawButton); @@ -58,7 +69,7 @@ InstallerWindow::InstallerWindow(BRect frame_rect) fDestMenu = new BPopUpMenu("scanning" B_UTF8_ELLIPSIS); fSrcMenu = new BPopUpMenu("scanning" B_UTF8_ELLIPSIS); - BRect fieldRect(bounds.left+50, bounds.top+70, bounds.left+250, bounds.top+90); + BRect fieldRect(bounds.left+50, bounds.top+70, bounds.right-13, bounds.top+90); fSrcMenuField = new BMenuField(fieldRect, "srcMenuField", "Install from: ", fSrcMenu); fSrcMenuField->SetDivider(70.0); @@ -77,6 +88,8 @@ InstallerWindow::InstallerWindow(BRect frame_rect) fDriveSetupLaunched = be_roster->IsRunning(DRIVESETUP_SIG); be_roster->StartWatching(this); + + PostMessage(START_SCAN); } InstallerWindow::~InstallerWindow() @@ -89,11 +102,17 @@ void InstallerWindow::MessageReceived(BMessage *msg) { switch (msg->what) { + case START_SCAN: + StartScan(); + break; case BEGIN_MESSAGE: break; case SHOW_BOTTOM_MESSAGE: ShowBottom(); break; + case SRC_PARTITION: + PublishPackages(); + break; case SETUP_MESSAGE: LaunchDriveSetup(); break; @@ -133,10 +152,14 @@ InstallerWindow::ShowBottom() ResizeTo(332,306); if (fSetupButton->IsHidden()) fSetupButton->Show(); + if (fPackagesScrollView->IsHidden()) + fPackagesScrollView->Show(); } else { - ResizeTo(332,160); if (!fSetupButton->IsHidden()) fSetupButton->Hide(); + if (!fPackagesScrollView->IsHidden()) + fPackagesScrollView->Hide(); + ResizeTo(332,160); } } @@ -153,7 +176,7 @@ void InstallerWindow::DisableInterface(bool disable) { if (!disable) { - ScanningInProgress(); + StartScan(); } fDriveSetupLaunched = disable; fBeginButton->SetEnabled(!disable); @@ -162,20 +185,44 @@ InstallerWindow::DisableInterface(bool disable) fDestMenuField->SetEnabled(!disable); if (disable) fStatusView->SetText("Running DriveSetup" B_UTF8_ELLIPSIS "\nClose DriveSetup to continue with the\ninstallation."); - } void -InstallerWindow::ScanningComplete() +InstallerWindow::StartScan() { + fStatusView->SetText("Scanning for disks" B_UTF8_ELLIPSIS); + + BMenuItem *item; + while ((item = fSrcMenu->RemoveItem((int32)0))) + delete item; + while ((item = fDestMenu->RemoveItem((int32)0))) + delete item; + + fSrcMenu->AddItem(new PartitionMenuItem("BeOS 5 PE Max Edition V3.1 beta", + new BMessage(SRC_PARTITION), "/BeOS 5 PE Max Edition V3.1 beta")); + + if (fSrcMenu->ItemAt(0)) + fSrcMenu->ItemAt(0)->SetMarked(true); fStatusView->SetText("Choose the disk you want to install onto\nfrom the pop-up menu. Then click \"Begin\"."); } void -InstallerWindow::ScanningInProgress() +InstallerWindow::PublishPackages() { - fStatusView->SetText("Scanning for disks" B_UTF8_ELLIPSIS); -} + fPackagesView->Clean(); + PartitionMenuItem *item = (PartitionMenuItem *)fSrcMenu->FindMarked(); + if (!item) + return; + BPath directory(item->Path()); + directory.Append("_packages_"); + BDirectory dir(directory.Path()); + if (dir.InitCheck()!=B_OK) + return; + + BEntry packageEntry; + while (dir.GetNextEntry(&packageEntry)==B_OK) { + } +} diff --git a/src/apps/installer/InstallerWindow.h b/src/apps/installer/InstallerWindow.h index 40e104c001..c868285082 100644 --- a/src/apps/installer/InstallerWindow.h +++ b/src/apps/installer/InstallerWindow.h @@ -10,9 +10,11 @@ #include #include #include +#include #include #include #include "DrawButton.h" +#include "PackageViews.h" class InstallerWindow : public BWindow { public: @@ -25,9 +27,9 @@ public: private: void DisableInterface(bool disable); void LaunchDriveSetup(); + void PublishPackages(); void ShowBottom(); - void ScanningComplete(); - void ScanningInProgress(); + void StartScan(); BBox *fBackBox; BButton *fBeginButton, *fSetupButton; DrawButton *fDrawButton; @@ -35,6 +37,8 @@ private: BTextView *fStatusView; BMenu* fSrcMenu, *fDestMenu; BMenuField* fSrcMenuField, *fDestMenuField; + PackagesView *fPackagesView; + BScrollView *fPackagesScrollView; }; #endif /* _InstallerWindow_h */ diff --git a/src/apps/installer/Jamfile b/src/apps/installer/Jamfile index 05e2a5bacb..1c20b9d505 100644 --- a/src/apps/installer/Jamfile +++ b/src/apps/installer/Jamfile @@ -7,6 +7,8 @@ App Installer : DrawButton.cpp InstallerApp.cpp InstallerWindow.cpp - : libbe.so libtracker.so + PackageViews.cpp + PartitionMenuItem.cpp + : be tracker : Installer.rdef ; diff --git a/src/apps/installer/PackageViews.cpp b/src/apps/installer/PackageViews.cpp new file mode 100644 index 0000000000..4db9403ee8 --- /dev/null +++ b/src/apps/installer/PackageViews.cpp @@ -0,0 +1,124 @@ +/* + * Copyright 2005, Jérôme DUVAL. All rights reserved. + * Distributed under the terms of the MIT License. + */ + +#include +#include +#include "PackageViews.h" + +Package::Package() + : fName(NULL), + fGroup(NULL), + fDescription(NULL), + fSize(0), + fIcon(NULL) +{ + +} + + +Package::~Package() +{ + free(fName); + free(fGroup); + free(fDescription); + free(fIcon); +} + + +Package * +Package::PackageFromEntry(BEntry &entry) +{ + BDirectory directory(&entry); + if (directory.InitCheck()!=B_OK) + return NULL; + Package *package = new Package(); + return package; +} + + +Group::Group() +{ + +} + +Group::~Group() +{ +} + + +PackageCheckBox::PackageCheckBox(BRect rect, Package &item) + : BCheckBox(rect, "pack_cb", item.Name(), NULL), + fPackage(item) +{ +} + + +PackageCheckBox::~PackageCheckBox() +{ +} + + +void +PackageCheckBox::Draw(BRect update) +{ + BCheckBox::Draw(update); +} + + +GroupView::GroupView(BRect rect, Group &group) + : BStringView(rect, "group", group.Name()), + fGroup(group) +{ + +} + +GroupView::~GroupView() +{ +} + + +PackagesView::PackagesView(BRect rect, const char* name) + : BView(rect, name, B_FOLLOW_ALL_SIDES, B_WILL_DRAW|B_FRAME_EVENTS) +{ + +} + + +PackagesView::~PackagesView() +{ + +} + + +void +PackagesView::AddPackage(Package &package) +{ + BRect rect = Bounds(); + rect.top = rect.bottom; + rect.bottom += 15; + PackageCheckBox *checkBox = new PackageCheckBox(rect, package); + AddChild(checkBox); + Invalidate(); +} + + +void +PackagesView::AddGroup(Group &group) +{ + BRect rect = Bounds(); + rect.top = rect.bottom; + rect.bottom += 15; + GroupView *view = new GroupView(rect, group); + AddChild(view); + Invalidate(); +} + + +void +PackagesView::Clean() +{ + +} + diff --git a/src/apps/installer/PackageViews.h b/src/apps/installer/PackageViews.h new file mode 100644 index 0000000000..224babb8d5 --- /dev/null +++ b/src/apps/installer/PackageViews.h @@ -0,0 +1,80 @@ +/* + * Copyright 2005, Jérôme DUVAL. All rights reserved. + * Distributed under the terms of the MIT License. + */ + +#ifndef __PACKAGEVIEWS_H__ +#define __PACKAGEVIEWS_H__ + +#include +#include +#include +#include +#include + +class Package { +public: + Package(); + ~Package(); + void SetName(const char *name) { free(fName); fName=strdup(name);}; + void SetGroup(const char *group) { free(fGroup); fName=strdup(group);}; + void SetDescription(const char *description) { free(fDescription); fName=strdup(description);}; + void SetSize(const int32 size) { fSize = size; }; + void SetIcon(const BBitmap * icon); + const char * Name() { return fName; }; + const char * Group() { return fGroup; }; + const char * Description() { return fDescription; }; + const int32 Size() { return fSize; }; + const BBitmap * Icon() { return fIcon; }; + + static int Compare(const void *firstArg, const void *secondArg); + static Package *PackageFromEntry(BEntry &dir); +private: + char *fName; + char *fGroup; + char *fDescription; + int32 fSize; + BBitmap *fIcon; +}; + +class Group { +public: + Group(); + ~Group(); + void SetName(const char *name) { free(fName); fName=strdup(name);}; + const char * Name() { return fName; }; +private: + char *fName; +}; + +class PackageCheckBox : public BCheckBox { + public: + PackageCheckBox(BRect rect, Package &item); + ~PackageCheckBox(); + void Draw(BRect update); + private: + Package &fPackage; +}; + +class GroupView : public BStringView { + public: + GroupView(BRect rect, Group &group); + ~GroupView(); + private: + Group &fGroup; + +}; + + +class PackagesView : public BView { +public: + PackagesView(BRect rect, const char* name); + ~PackagesView(); + void AddPackage(Package &package); + void AddGroup(Group &group); + void Clean(); +private: + BList fViews; +}; + +#endif /* __PACKAGEVIEWS_H__ */ diff --git a/src/apps/installer/PartitionMenuItem.cpp b/src/apps/installer/PartitionMenuItem.cpp new file mode 100644 index 0000000000..72d27cc07f --- /dev/null +++ b/src/apps/installer/PartitionMenuItem.cpp @@ -0,0 +1,23 @@ +/* + * Copyright 2005, Jérôme DUVAL. All rights reserved. + * Distributed under the terms of the MIT License. + */ + +#include +#include +#include + +#include "PartitionMenuItem.h" + +PartitionMenuItem::PartitionMenuItem(const char *label, BMessage *msg, const char* path) + : BMenuItem(label, msg) +{ + fPath = strdup(path); +} + + +PartitionMenuItem::~PartitionMenuItem() +{ + free(fPath); +} + diff --git a/src/apps/installer/PartitionMenuItem.h b/src/apps/installer/PartitionMenuItem.h new file mode 100644 index 0000000000..dff9c580da --- /dev/null +++ b/src/apps/installer/PartitionMenuItem.h @@ -0,0 +1,22 @@ +/* + * Copyright 2005, Jérôme DUVAL. All rights reserved. + * Distributed under the terms of the MIT License. + */ + +#ifndef __PARTITIONMENUITEM_H_ +#define __PARTITIONMENUITEM_H_ + + +#include + + +class PartitionMenuItem : public BMenuItem { + public: + PartitionMenuItem(const char *label, BMessage *msg, const char* path); + ~PartitionMenuItem(); + const char* Path() { return fPath; }; + private: + char *fPath; +}; + +#endif /* __PARTITIONMENUITEM_H_ */