fix packages view, added a copy engine class

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14283 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval 2005-09-30 14:58:05 +00:00
parent aa6505c068
commit 633dee064e
7 changed files with 181 additions and 44 deletions

View File

@ -0,0 +1,85 @@
/*
* Copyright 2005, Jérôme DUVAL. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include "CopyEngine.h"
#include "InstallerWindow.h"
#include <DiskDeviceRoster.h>
#include <Path.h>
CopyEngine::CopyEngine(InstallerWindow *window)
: BLooper("copy_engine"),
fWindow(window)
{
}
void
CopyEngine::LaunchInitScript(BVolume *volume)
{
fWindow->SetStatusMessage("Starting Installation.");
}
void
CopyEngine::LaunchFinishScript(BVolume *volume)
{
fWindow->SetStatusMessage("Finishing Installation.");
}
void
CopyEngine::Start()
{
BVolume *volume;
// check not installing on boot volume
// check if target is initialized
// ask if init ou mount as is
LaunchInitScript(volume);
// copy source volume
// copy selected packages
LaunchFinishScript(volume);
}
void
CopyEngine::ScanDisksPartitions(BMenu *srcMenu, BMenu *dstMenu)
{
BDiskDeviceRoster roster;
BDiskDevice device;
roster.VisitEachDevice(this, &device);
BPartition *partition;
roster.VisitEachPartition(this, &device, &partition);
}
bool
CopyEngine::Visit(BDiskDevice *device)
{
BPath path;
if (device->GetPath(&path)==B_OK)
printf("CopyEngine::Visit(BDiskDevice *) : %s\n", path.Path());
return false;
}
bool
CopyEngine::Visit(BPartition *partition, int32 level)
{
BPath path;
if (partition->GetPath(&path)==B_OK)
printf("CopyEngine::Visit(BPartition *) : %s\n", path.Path());
printf("CopyEngine::Visit(BPartition *) : %s\n", partition->Name());
return false;
}

View File

@ -0,0 +1,32 @@
/*
* Copyright 2005, Jérôme DUVAL. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _CopyEngine_h
#define _CopyEngine_h
#include <DiskDeviceVisitor.h>
#include <DiskDevice.h>
#include <Looper.h>
#include <Messenger.h>
#include <Partition.h>
#include <Volume.h>
class InstallerWindow;
class CopyEngine : public BLooper, BDiskDeviceVisitor {
public:
CopyEngine(InstallerWindow *window);
void Start();
void ScanDisksPartitions(BMenu *srcMenu, BMenu *dstMenu);
virtual bool Visit(BDiskDevice *device);
virtual bool Visit(BPartition *partition, int32 level);
private:
void LaunchInitScript(BVolume *volume);
void LaunchFinishScript(BVolume *volume);
InstallerWindow *fWindow;
};
#endif /* _CopyEngine_h */

View File

@ -5,6 +5,7 @@
#include <Alert.h> #include <Alert.h>
#include <Application.h> #include <Application.h>
#include <Autolock.h>
#include <Box.h> #include <Box.h>
#include <ClassInfo.h> #include <ClassInfo.h>
#include <Directory.h> #include <Directory.h>
@ -28,7 +29,8 @@ const uint32 PACKAGE_CHECKBOX = 'iPCB';
InstallerWindow::InstallerWindow(BRect frame_rect) InstallerWindow::InstallerWindow(BRect frame_rect)
: BWindow(frame_rect, "Installer", B_TITLED_WINDOW, B_NOT_ZOOMABLE | B_NOT_RESIZABLE), : BWindow(frame_rect, "Installer", B_TITLED_WINDOW, B_NOT_ZOOMABLE | B_NOT_RESIZABLE),
fDriveSetupLaunched(false) fDriveSetupLaunched(false),
fCopyEngine(this)
{ {
BRect bounds = Bounds(); BRect bounds = Bounds();
@ -119,6 +121,7 @@ InstallerWindow::MessageReceived(BMessage *msg)
StartScan(); StartScan();
break; break;
case BEGIN_MESSAGE: case BEGIN_MESSAGE:
fCopyEngine.Start();
break; break;
case SHOW_BOTTOM_MESSAGE: case SHOW_BOTTOM_MESSAGE:
ShowBottom(); ShowBottom();
@ -209,14 +212,14 @@ InstallerWindow::DisableInterface(bool disable)
fSrcMenuField->SetEnabled(!disable); fSrcMenuField->SetEnabled(!disable);
fDestMenuField->SetEnabled(!disable); fDestMenuField->SetEnabled(!disable);
if (disable) if (disable)
fStatusView->SetText("Running DriveSetup" B_UTF8_ELLIPSIS "\nClose DriveSetup to continue with the\ninstallation."); SetStatusMessage("Running DriveSetup" B_UTF8_ELLIPSIS "\nClose DriveSetup to continue with the\ninstallation.");
} }
void void
InstallerWindow::StartScan() InstallerWindow::StartScan()
{ {
fStatusView->SetText("Scanning for disks" B_UTF8_ELLIPSIS); SetStatusMessage("Scanning for disks" B_UTF8_ELLIPSIS);
BMenuItem *item; BMenuItem *item;
while ((item = fSrcMenu->RemoveItem((int32)0))) while ((item = fSrcMenu->RemoveItem((int32)0)))
@ -224,6 +227,8 @@ InstallerWindow::StartScan()
while ((item = fDestMenu->RemoveItem((int32)0))) while ((item = fDestMenu->RemoveItem((int32)0)))
delete item; delete item;
fCopyEngine.ScanDisksPartitions(fSrcMenu, fDestMenu);
fSrcMenu->AddItem(new PartitionMenuItem("BeOS 5 PE Max Edition V3.1 beta", fSrcMenu->AddItem(new PartitionMenuItem("BeOS 5 PE Max Edition V3.1 beta",
new BMessage(SRC_PARTITION), "/BeOS 5 PE Max Edition V3.1 beta")); new BMessage(SRC_PARTITION), "/BeOS 5 PE Max Edition V3.1 beta"));
@ -231,7 +236,7 @@ InstallerWindow::StartScan()
fSrcMenu->ItemAt(0)->SetMarked(true); fSrcMenu->ItemAt(0)->SetMarked(true);
PublishPackages(); PublishPackages();
} }
fStatusView->SetText("Choose the disk you want to install onto\nfrom the pop-up menu. Then click \"Begin\"."); SetStatusMessage("Choose the disk you want to install onto\nfrom the pop-up menu. Then click \"Begin\".");
} }
@ -281,3 +286,10 @@ InstallerWindow::ComparePackages(const void *firstArg, const void *secondArg)
return strcmp(package1->Name(), package2->Name()); return strcmp(package1->Name(), package2->Name());
} }
void
InstallerWindow::SetStatusMessage(char *text)
{
BAutolock(this);
fStatusView->SetText(text);
}

View File

@ -13,6 +13,7 @@
#include <ScrollView.h> #include <ScrollView.h>
#include <TextView.h> #include <TextView.h>
#include <Window.h> #include <Window.h>
#include "CopyEngine.h"
#include "DrawButton.h" #include "DrawButton.h"
#include "PackageViews.h" #include "PackageViews.h"
@ -23,6 +24,7 @@ public:
virtual void MessageReceived(BMessage *msg); virtual void MessageReceived(BMessage *msg);
virtual bool QuitRequested(); virtual bool QuitRequested();
void SetStatusMessage(char *text);
private: private:
void DisableInterface(bool disable); void DisableInterface(bool disable);
void LaunchDriveSetup(); void LaunchDriveSetup();
@ -40,6 +42,8 @@ private:
PackagesView *fPackagesView; PackagesView *fPackagesView;
BScrollView *fPackagesScrollView; BScrollView *fPackagesScrollView;
BStringView *fSizeView; BStringView *fSizeView;
CopyEngine fCopyEngine;
}; };
#endif /* _InstallerWindow_h */ #endif /* _InstallerWindow_h */

View File

@ -1,10 +1,12 @@
SubDir OBOS_TOP src apps installer ; SubDir OBOS_TOP src apps installer ;
UsePrivateHeaders shared ; UsePrivateHeaders shared ;
UsePrivateHeaders storage ;
UsePrivateHeaders tracker ; UsePrivateHeaders tracker ;
SubDirHdrs [ FDirName $(OBOS_TOP) src kits tracker ] ; SubDirHdrs [ FDirName $(OBOS_TOP) src kits tracker ] ;
App Installer : App Installer :
CopyEngine.cpp
DrawButton.cpp DrawButton.cpp
InstallerApp.cpp InstallerApp.cpp
InstallerCopyLoopControl.cpp InstallerCopyLoopControl.cpp

View File

@ -32,8 +32,6 @@ SizeAsString(int32 size, char *string)
Package::Package() Package::Package()
: Group(), : Group(),
fName(NULL),
fDescription(NULL),
fSize(0), fSize(0),
fIcon(NULL) fIcon(NULL)
{ {
@ -43,8 +41,6 @@ Package::Package()
Package::~Package() Package::~Package()
{ {
free(fName);
free(fDescription);
delete fIcon; delete fIcon;
} }
@ -56,17 +52,16 @@ Package::PackageFromEntry(BEntry &entry)
if (directory.InitCheck()!=B_OK) if (directory.InitCheck()!=B_OK)
return NULL; return NULL;
Package *package = new Package(); Package *package = new Package();
char name[255];
char group[255];
char description[255];
bool alwaysOn; bool alwaysOn;
bool onByDefault; bool onByDefault;
int32 size; int32 size;
if (directory.ReadAttr("INSTALLER PACKAGE: NAME", B_STRING_TYPE, 0, name, 255)<0) char group[64];
memset(group, 0, 64);
if (directory.ReadAttr("INSTALLER PACKAGE: NAME", B_STRING_TYPE, 0, package->fName, 64)<0)
goto err; goto err;
if (directory.ReadAttr("INSTALLER PACKAGE: GROUP", B_STRING_TYPE, 0, group, 255)<0) if (directory.ReadAttr("INSTALLER PACKAGE: GROUP", B_STRING_TYPE, 0, group, 64)<0)
goto err; goto err;
if (directory.ReadAttr("INSTALLER PACKAGE: DESCRIPTION", B_STRING_TYPE, 0, description, 255)<0) if (directory.ReadAttr("INSTALLER PACKAGE: DESCRIPTION", B_STRING_TYPE, 0, package->fDescription, 64)<0)
goto err; goto err;
if (directory.ReadAttr("INSTALLER PACKAGE: ON_BY_DEFAULT", B_BOOL_TYPE, 0, &onByDefault, sizeof(onByDefault))<0) if (directory.ReadAttr("INSTALLER PACKAGE: ON_BY_DEFAULT", B_BOOL_TYPE, 0, &onByDefault, sizeof(onByDefault))<0)
goto err; goto err;
@ -74,9 +69,7 @@ Package::PackageFromEntry(BEntry &entry)
goto err; goto err;
if (directory.ReadAttr("INSTALLER PACKAGE: SIZE", B_INT32_TYPE, 0, &size, sizeof(size))<0) if (directory.ReadAttr("INSTALLER PACKAGE: SIZE", B_INT32_TYPE, 0, &size, sizeof(size))<0)
goto err; goto err;
package->SetName(name);
package->SetGroupName(group); package->SetGroupName(group);
package->SetDescription(description);
package->SetSize(size); package->SetSize(size);
package->SetAlwaysOn(alwaysOn); package->SetAlwaysOn(alwaysOn);
package->SetOnByDefault(onByDefault); package->SetOnByDefault(onByDefault);
@ -105,19 +98,17 @@ Package::GetSizeAsString(char *string)
Group::Group() Group::Group()
: fGroup(NULL)
{ {
} }
Group::~Group() Group::~Group()
{ {
free(fGroup);
} }
PackageCheckBox::PackageCheckBox(BRect rect, Package &item) PackageCheckBox::PackageCheckBox(BRect rect, Package *item)
: BCheckBox(rect.OffsetBySelf(7,0), "pack_cb", item.Name(), NULL), : BCheckBox(rect.OffsetBySelf(7,0), "pack_cb", item->Name(), NULL),
fPackage(item) fPackage(item)
{ {
} }
@ -125,6 +116,7 @@ PackageCheckBox::PackageCheckBox(BRect rect, Package &item)
PackageCheckBox::~PackageCheckBox() PackageCheckBox::~PackageCheckBox()
{ {
delete fPackage;
} }
@ -133,17 +125,17 @@ PackageCheckBox::Draw(BRect update)
{ {
BCheckBox::Draw(update); BCheckBox::Draw(update);
char string[15]; char string[15];
fPackage.GetSizeAsString(string); fPackage->GetSizeAsString(string);
float width = StringWidth(string); float width = StringWidth(string);
DrawString(string, BPoint(Bounds().right - width - 8, 11)); DrawString(string, BPoint(Bounds().right - width - 8, 11));
const BBitmap *icon = fPackage.Icon(); const BBitmap *icon = fPackage->Icon();
if (icon) if (icon)
DrawBitmap(icon, BPoint(Bounds().right - 92, 0)); DrawBitmap(icon, BPoint(Bounds().right - 92, 0));
} }
GroupView::GroupView(BRect rect, Group &group) GroupView::GroupView(BRect rect, Group *group)
: BStringView(rect, "group", group.GroupName()), : BStringView(rect, "group", group->GroupName()),
fGroup(group) fGroup(group)
{ {
SetFont(be_bold_font); SetFont(be_bold_font);
@ -152,6 +144,7 @@ GroupView::GroupView(BRect rect, Group &group)
GroupView::~GroupView() GroupView::~GroupView()
{ {
delete fGroup;
} }
@ -170,7 +163,14 @@ PackagesView::~PackagesView()
void void
PackagesView::Clean() PackagesView::Clean()
{ {
BView *view;
while ((view = ChildAt(0))) {
if (dynamic_cast<GroupView*>(view) || dynamic_cast<PackageCheckBox*>(view)) {
RemoveChild(view);
delete view;
}
}
ScrollTo(0,0);
} }
@ -182,6 +182,7 @@ PackagesView::AddPackages(BList &packages, BMessage *msg)
BRect bounds = rect; BRect bounds = rect;
rect.left = 1; rect.left = 1;
rect.bottom = 15; rect.bottom = 15;
rect.top = 0;
BString lastGroup = ""; BString lastGroup = "";
for (int32 i=0; i<count; i++) { for (int32 i=0; i<count; i++) {
void *item = packages.ItemAt(i); void *item = packages.ItemAt(i);
@ -191,30 +192,30 @@ PackagesView::AddPackages(BList &packages, BMessage *msg)
lastGroup = package->GroupName(); lastGroup = package->GroupName();
Group *group = new Group(); Group *group = new Group();
group->SetGroupName(package->GroupName()); group->SetGroupName(package->GroupName());
GroupView *view = new GroupView(rect, *group); GroupView *view = new GroupView(rect, group);
AddChild(view); AddChild(view);
rect.OffsetBy(0, 17); rect.OffsetBy(0, 17);
} }
PackageCheckBox *checkBox = new PackageCheckBox(rect, *package); PackageCheckBox *checkBox = new PackageCheckBox(rect, package);
checkBox->SetValue(package->OnByDefault() ? B_CONTROL_ON : B_CONTROL_OFF); checkBox->SetValue(package->OnByDefault() ? B_CONTROL_ON : B_CONTROL_OFF);
checkBox->SetEnabled(!package->AlwaysOn()); checkBox->SetEnabled(!package->AlwaysOn());
checkBox->SetMessage(msg); checkBox->SetMessage(new BMessage(*msg));
AddChild(checkBox); AddChild(checkBox);
rect.OffsetBy(0, 20); rect.OffsetBy(0, 20);
} }
ResizeTo(bounds.Width(), rect.bottom); ResizeTo(bounds.Width(), rect.top);
BScrollBar *vertScroller = ScrollBar(B_VERTICAL); BScrollBar *vertScroller = ScrollBar(B_VERTICAL);
if (bounds.Height() > rect.top) { if (vertScroller->Bounds().Height() > rect.top) {
vertScroller->SetRange(0.0f, 0.0f); vertScroller->SetRange(0.0f, 0.0f);
vertScroller->SetValue(0.0f); vertScroller->SetValue(0.0f);
} else { } else {
vertScroller->SetRange(0.0f, rect.top - bounds.Height()); vertScroller->SetRange(0.0f, rect.top - vertScroller->Bounds().Height());
vertScroller->SetProportion(bounds.Height () / rect.top); vertScroller->SetProportion(vertScroller->Bounds().Height() / rect.top);
} }
vertScroller->SetSteps(15, bounds.Height()); vertScroller->SetSteps(15, vertScroller->Bounds().Height());
Invalidate(); Invalidate();
} }
@ -232,3 +233,4 @@ PackagesView::GetTotalSizeAsString(char *string)
} }
SizeAsString(size, string); SizeAsString(size, string);
} }

View File

@ -17,10 +17,10 @@ class Group {
public: public:
Group(); Group();
virtual ~Group(); virtual ~Group();
void SetGroupName(const char *group) { free(fGroup); fGroup=strdup(group);}; void SetGroupName(const char *group) { strcpy(fGroup, group); };
const char * GroupName() const { return fGroup; }; const char * GroupName() const { return fGroup; };
private: private:
char *fGroup; char fGroup[64];
}; };
@ -28,8 +28,8 @@ class Package : public Group {
public: public:
Package(); Package();
virtual ~Package(); virtual ~Package();
void SetName(const char *name) { free(fName); fName=strdup(name);}; void SetName(const char *name) { strcpy(fName, name);};
void SetDescription(const char *description) { free(fDescription); fDescription=strdup(description);}; void SetDescription(const char *description) { strcpy(fDescription, description);};
void SetSize(const int32 size) { fSize = size; }; void SetSize(const int32 size) { fSize = size; };
void SetIcon(BBitmap * icon) { delete fIcon; fIcon = icon; }; void SetIcon(BBitmap * icon) { delete fIcon; fIcon = icon; };
void SetOnByDefault(bool onByDefault) { fOnByDefault = onByDefault; }; void SetOnByDefault(bool onByDefault) { fOnByDefault = onByDefault; };
@ -44,8 +44,8 @@ public:
static Package *PackageFromEntry(BEntry &dir); static Package *PackageFromEntry(BEntry &dir);
private: private:
char *fName; char fName[64];
char *fDescription; char fDescription[64];
int32 fSize; int32 fSize;
BBitmap *fIcon; BBitmap *fIcon;
bool fAlwaysOn, fOnByDefault; bool fAlwaysOn, fOnByDefault;
@ -54,20 +54,20 @@ private:
class PackageCheckBox : public BCheckBox { class PackageCheckBox : public BCheckBox {
public: public:
PackageCheckBox(BRect rect, Package &item); PackageCheckBox(BRect rect, Package *item);
virtual ~PackageCheckBox(); virtual ~PackageCheckBox();
virtual void Draw(BRect update); virtual void Draw(BRect update);
Package *GetPackage() { return &fPackage; }; Package *GetPackage() { return fPackage; };
private: private:
Package &fPackage; Package *fPackage;
}; };
class GroupView : public BStringView { class GroupView : public BStringView {
public: public:
GroupView(BRect rect, Group &group); GroupView(BRect rect, Group *group);
virtual ~GroupView(); virtual ~GroupView();
private: private:
Group &fGroup; Group *fGroup;
}; };