From 8d71ca3e253f0d5cd4b9bb37171e4ca5553dcc54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 24 Sep 2005 15:58:04 +0000 Subject: [PATCH] displays package list git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14234 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/installer/InstallerWindow.cpp | 33 +++++++- src/apps/installer/InstallerWindow.h | 2 +- src/apps/installer/PackageViews.cpp | 106 ++++++++++++++++++------- src/apps/installer/PackageViews.h | 60 +++++++------- 4 files changed, 142 insertions(+), 59 deletions(-) diff --git a/src/apps/installer/InstallerWindow.cpp b/src/apps/installer/InstallerWindow.cpp index 8cc0ea1e06..8b6afcbc77 100644 --- a/src/apps/installer/InstallerWindow.cpp +++ b/src/apps/installer/InstallerWindow.cpp @@ -6,11 +6,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include "InstallerWindow.h" #include "PartitionMenuItem.h" @@ -202,8 +204,10 @@ InstallerWindow::StartScan() 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)) + if (fSrcMenu->ItemAt(0)) { fSrcMenu->ItemAt(0)->SetMarked(true); + PublishPackages(); + } fStatusView->SetText("Choose the disk you want to install onto\nfrom the pop-up menu. Then click \"Begin\"."); } @@ -223,6 +227,33 @@ InstallerWindow::PublishPackages() return; BEntry packageEntry; + BList packages; while (dir.GetNextEntry(&packageEntry)==B_OK) { + Package *package = Package::PackageFromEntry(packageEntry); + if (package) { + packages.AddItem(package); + } } + packages.SortItems(ComparePackages); + + fPackagesView->AddPackages(packages); } + + +int +InstallerWindow::ComparePackages(const void *firstArg, const void *secondArg) +{ + const Group *group1 = *static_cast(firstArg); + const Group *group2 = *static_cast(secondArg); + const Package *package1 = dynamic_cast(group1); + const Package *package2 = dynamic_cast(group2); + int sameGroup = strcmp(group1->GroupName(), group2->GroupName()); + if (sameGroup != 0) + return sameGroup; + if (!package2) + return -1; + if (!package1) + return 1; + return strcmp(package1->Name(), package2->Name()); +} + diff --git a/src/apps/installer/InstallerWindow.h b/src/apps/installer/InstallerWindow.h index c868285082..afa80c2f5e 100644 --- a/src/apps/installer/InstallerWindow.h +++ b/src/apps/installer/InstallerWindow.h @@ -23,13 +23,13 @@ public: virtual void MessageReceived(BMessage *msg); virtual bool QuitRequested(); - private: void DisableInterface(bool disable); void LaunchDriveSetup(); void PublishPackages(); void ShowBottom(); void StartScan(); + static int ComparePackages(const void *firstArg, const void *secondArg); BBox *fBackBox; BButton *fBeginButton, *fSetupButton; DrawButton *fDrawButton; diff --git a/src/apps/installer/PackageViews.cpp b/src/apps/installer/PackageViews.cpp index 4db9403ee8..8bb8f34e9a 100644 --- a/src/apps/installer/PackageViews.cpp +++ b/src/apps/installer/PackageViews.cpp @@ -4,12 +4,14 @@ */ #include +#include +#include #include #include "PackageViews.h" Package::Package() - : fName(NULL), - fGroup(NULL), + : Group(), + fName(NULL), fDescription(NULL), fSize(0), fIcon(NULL) @@ -21,7 +23,6 @@ Package::Package() Package::~Package() { free(fName); - free(fGroup); free(fDescription); free(fIcon); } @@ -34,22 +35,51 @@ Package::PackageFromEntry(BEntry &entry) if (directory.InitCheck()!=B_OK) return NULL; Package *package = new Package(); + char name[255]; + char group[255]; + char description[255]; + bool alwaysOn; + bool onByDefault; + int32 size; + if (directory.ReadAttr("INSTALLER PACKAGE: NAME", B_STRING_TYPE, 0, name, 255)<0) + goto err; + if (directory.ReadAttr("INSTALLER PACKAGE: GROUP", B_STRING_TYPE, 0, group, 255)<0) + goto err; + if (directory.ReadAttr("INSTALLER PACKAGE: DESCRIPTION", B_STRING_TYPE, 0, description, 255)<0) + goto err; + if (directory.ReadAttr("INSTALLER PACKAGE: ON_BY_DEFAULT", B_BOOL_TYPE, 0, &onByDefault, sizeof(onByDefault))<0) + goto err; + if (directory.ReadAttr("INSTALLER PACKAGE: ALWAYS_ON", B_BOOL_TYPE, 0, &alwaysOn, sizeof(alwaysOn))<0) + goto err; + if (directory.ReadAttr("INSTALLER PACKAGE: SIZE", B_INT32_TYPE, 0, &size, sizeof(size))<0) + goto err; + package->SetName(name); + package->SetGroupName(group); + package->SetDescription(description); + package->SetSize(size); + package->SetAlwaysOn(alwaysOn); + package->SetOnByDefault(onByDefault); return package; +err: + delete package; + return NULL; } Group::Group() + : fGroup(NULL) { } Group::~Group() { + free(fGroup); } PackageCheckBox::PackageCheckBox(BRect rect, Package &item) - : BCheckBox(rect, "pack_cb", item.Name(), NULL), + : BCheckBox(rect.OffsetBySelf(7,0), "pack_cb", item.Name(), NULL), fPackage(item) { } @@ -68,10 +98,10 @@ PackageCheckBox::Draw(BRect update) GroupView::GroupView(BRect rect, Group &group) - : BStringView(rect, "group", group.Name()), + : BStringView(rect, "group", group.GroupName()), fGroup(group) { - + SetFont(be_bold_font); } GroupView::~GroupView() @@ -92,33 +122,53 @@ PackagesView::~PackagesView() } -void -PackagesView::AddPackage(Package &package) +void +PackagesView::Clean() { - 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() +PackagesView::AddPackages(BList &packages) { + int32 count = packages.CountItems(); + BRect rect = Bounds(); + BRect bounds = rect; + rect.left = 1; + rect.bottom = 15; + BString lastGroup = ""; + for (int32 i=0; i (item); + if (lastGroup != BString(package->GroupName())) { + rect.OffsetBy(0, 1); + lastGroup = package->GroupName(); + Group *group = new Group(); + group->SetGroupName(package->GroupName()); + GroupView *view = new GroupView(rect, *group); + AddChild(view); + rect.OffsetBy(0, 17); + } + PackageCheckBox *checkBox = new PackageCheckBox(rect, *package); + checkBox->SetValue(package->OnByDefault() ? B_CONTROL_ON : B_CONTROL_OFF); + checkBox->SetEnabled(!package->AlwaysOn()); + AddChild(checkBox); + rect.OffsetBy(0, 20); + } + ResizeTo(bounds.Width(), rect.bottom); + BScrollBar *vertScroller = ScrollBar(B_VERTICAL); + + if (bounds.Height() > rect.top) { + vertScroller->SetRange(0.0f, 0.0f); + vertScroller->SetValue(0.0f); + } else { + vertScroller->SetRange(0.0f, rect.top - bounds.Height()); + vertScroller->SetProportion(bounds.Height () / rect.top); + } + + vertScroller->SetSteps(15, bounds.Height()); + + Invalidate(); } - diff --git a/src/apps/installer/PackageViews.h b/src/apps/installer/PackageViews.h index 224babb8d5..192a704dec 100644 --- a/src/apps/installer/PackageViews.h +++ b/src/apps/installer/PackageViews.h @@ -12,41 +12,44 @@ #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(); + virtual ~Group(); + void SetGroupName(const char *group) { free(fGroup); fGroup=strdup(group);}; + const char * GroupName() const { return fGroup; }; +private: + char *fGroup; +}; + + +class Package : public Group { +public: + Package(); + virtual ~Package(); void SetName(const char *name) { free(fName); fName=strdup(name);}; - const char * Name() { return fName; }; + void SetDescription(const char *description) { free(fDescription); fDescription=strdup(description);}; + void SetSize(const int32 size) { fSize = size; }; + void SetIcon(const BBitmap * icon); + void SetOnByDefault(bool onByDefault) { fOnByDefault = onByDefault; }; + void SetAlwaysOn(bool alwaysOn) { fAlwaysOn = alwaysOn; }; + const char * Name() const { return fName; }; + const char * Description() const { return fDescription; }; + const int32 Size() const { return fSize; }; + const BBitmap * Icon() const { return fIcon; }; + bool OnByDefault() const { return fOnByDefault; }; + bool AlwaysOn() const { return fAlwaysOn; }; + + static Package *PackageFromEntry(BEntry &dir); private: char *fName; + char *fDescription; + int32 fSize; + BBitmap *fIcon; + bool fAlwaysOn, fOnByDefault; }; + class PackageCheckBox : public BCheckBox { public: PackageCheckBox(BRect rect, Package &item); @@ -70,9 +73,8 @@ class PackagesView : public BView { public: PackagesView(BRect rect, const char* name); ~PackagesView(); - void AddPackage(Package &package); - void AddGroup(Group &group); void Clean(); + void AddPackages(BList &list); private: BList fViews; };