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:
parent
aa6505c068
commit
633dee064e
|
@ -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;
|
||||
}
|
||||
|
|
@ -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 */
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
#include <Alert.h>
|
||||
#include <Application.h>
|
||||
#include <Autolock.h>
|
||||
#include <Box.h>
|
||||
#include <ClassInfo.h>
|
||||
#include <Directory.h>
|
||||
|
@ -28,7 +29,8 @@ const uint32 PACKAGE_CHECKBOX = 'iPCB';
|
|||
|
||||
InstallerWindow::InstallerWindow(BRect frame_rect)
|
||||
: BWindow(frame_rect, "Installer", B_TITLED_WINDOW, B_NOT_ZOOMABLE | B_NOT_RESIZABLE),
|
||||
fDriveSetupLaunched(false)
|
||||
fDriveSetupLaunched(false),
|
||||
fCopyEngine(this)
|
||||
{
|
||||
|
||||
BRect bounds = Bounds();
|
||||
|
@ -119,6 +121,7 @@ InstallerWindow::MessageReceived(BMessage *msg)
|
|||
StartScan();
|
||||
break;
|
||||
case BEGIN_MESSAGE:
|
||||
fCopyEngine.Start();
|
||||
break;
|
||||
case SHOW_BOTTOM_MESSAGE:
|
||||
ShowBottom();
|
||||
|
@ -209,14 +212,14 @@ InstallerWindow::DisableInterface(bool disable)
|
|||
fSrcMenuField->SetEnabled(!disable);
|
||||
fDestMenuField->SetEnabled(!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
|
||||
InstallerWindow::StartScan()
|
||||
{
|
||||
fStatusView->SetText("Scanning for disks" B_UTF8_ELLIPSIS);
|
||||
SetStatusMessage("Scanning for disks" B_UTF8_ELLIPSIS);
|
||||
|
||||
BMenuItem *item;
|
||||
while ((item = fSrcMenu->RemoveItem((int32)0)))
|
||||
|
@ -224,6 +227,8 @@ InstallerWindow::StartScan()
|
|||
while ((item = fDestMenu->RemoveItem((int32)0)))
|
||||
delete item;
|
||||
|
||||
fCopyEngine.ScanDisksPartitions(fSrcMenu, fDestMenu);
|
||||
|
||||
fSrcMenu->AddItem(new PartitionMenuItem("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);
|
||||
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());
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
InstallerWindow::SetStatusMessage(char *text)
|
||||
{
|
||||
BAutolock(this);
|
||||
fStatusView->SetText(text);
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <ScrollView.h>
|
||||
#include <TextView.h>
|
||||
#include <Window.h>
|
||||
#include "CopyEngine.h"
|
||||
#include "DrawButton.h"
|
||||
#include "PackageViews.h"
|
||||
|
||||
|
@ -23,6 +24,7 @@ public:
|
|||
|
||||
virtual void MessageReceived(BMessage *msg);
|
||||
virtual bool QuitRequested();
|
||||
void SetStatusMessage(char *text);
|
||||
private:
|
||||
void DisableInterface(bool disable);
|
||||
void LaunchDriveSetup();
|
||||
|
@ -40,6 +42,8 @@ private:
|
|||
PackagesView *fPackagesView;
|
||||
BScrollView *fPackagesScrollView;
|
||||
BStringView *fSizeView;
|
||||
|
||||
CopyEngine fCopyEngine;
|
||||
};
|
||||
|
||||
#endif /* _InstallerWindow_h */
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
SubDir OBOS_TOP src apps installer ;
|
||||
|
||||
UsePrivateHeaders shared ;
|
||||
UsePrivateHeaders storage ;
|
||||
UsePrivateHeaders tracker ;
|
||||
SubDirHdrs [ FDirName $(OBOS_TOP) src kits tracker ] ;
|
||||
|
||||
App Installer :
|
||||
CopyEngine.cpp
|
||||
DrawButton.cpp
|
||||
InstallerApp.cpp
|
||||
InstallerCopyLoopControl.cpp
|
||||
|
|
|
@ -32,8 +32,6 @@ SizeAsString(int32 size, char *string)
|
|||
|
||||
Package::Package()
|
||||
: Group(),
|
||||
fName(NULL),
|
||||
fDescription(NULL),
|
||||
fSize(0),
|
||||
fIcon(NULL)
|
||||
{
|
||||
|
@ -43,8 +41,6 @@ Package::Package()
|
|||
|
||||
Package::~Package()
|
||||
{
|
||||
free(fName);
|
||||
free(fDescription);
|
||||
delete fIcon;
|
||||
}
|
||||
|
||||
|
@ -56,17 +52,16 @@ 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)
|
||||
char group[64];
|
||||
memset(group, 0, 64);
|
||||
if (directory.ReadAttr("INSTALLER PACKAGE: NAME", B_STRING_TYPE, 0, package->fName, 64)<0)
|
||||
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;
|
||||
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;
|
||||
if (directory.ReadAttr("INSTALLER PACKAGE: ON_BY_DEFAULT", B_BOOL_TYPE, 0, &onByDefault, sizeof(onByDefault))<0)
|
||||
goto err;
|
||||
|
@ -74,9 +69,7 @@ Package::PackageFromEntry(BEntry &entry)
|
|||
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);
|
||||
|
@ -105,19 +98,17 @@ Package::GetSizeAsString(char *string)
|
|||
|
||||
|
||||
Group::Group()
|
||||
: fGroup(NULL)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Group::~Group()
|
||||
{
|
||||
free(fGroup);
|
||||
}
|
||||
|
||||
|
||||
PackageCheckBox::PackageCheckBox(BRect rect, Package &item)
|
||||
: BCheckBox(rect.OffsetBySelf(7,0), "pack_cb", item.Name(), NULL),
|
||||
PackageCheckBox::PackageCheckBox(BRect rect, Package *item)
|
||||
: BCheckBox(rect.OffsetBySelf(7,0), "pack_cb", item->Name(), NULL),
|
||||
fPackage(item)
|
||||
{
|
||||
}
|
||||
|
@ -125,6 +116,7 @@ PackageCheckBox::PackageCheckBox(BRect rect, Package &item)
|
|||
|
||||
PackageCheckBox::~PackageCheckBox()
|
||||
{
|
||||
delete fPackage;
|
||||
}
|
||||
|
||||
|
||||
|
@ -133,17 +125,17 @@ PackageCheckBox::Draw(BRect update)
|
|||
{
|
||||
BCheckBox::Draw(update);
|
||||
char string[15];
|
||||
fPackage.GetSizeAsString(string);
|
||||
fPackage->GetSizeAsString(string);
|
||||
float width = StringWidth(string);
|
||||
DrawString(string, BPoint(Bounds().right - width - 8, 11));
|
||||
|
||||
const BBitmap *icon = fPackage.Icon();
|
||||
const BBitmap *icon = fPackage->Icon();
|
||||
if (icon)
|
||||
DrawBitmap(icon, BPoint(Bounds().right - 92, 0));
|
||||
}
|
||||
|
||||
GroupView::GroupView(BRect rect, Group &group)
|
||||
: BStringView(rect, "group", group.GroupName()),
|
||||
GroupView::GroupView(BRect rect, Group *group)
|
||||
: BStringView(rect, "group", group->GroupName()),
|
||||
fGroup(group)
|
||||
{
|
||||
SetFont(be_bold_font);
|
||||
|
@ -152,6 +144,7 @@ GroupView::GroupView(BRect rect, Group &group)
|
|||
|
||||
GroupView::~GroupView()
|
||||
{
|
||||
delete fGroup;
|
||||
}
|
||||
|
||||
|
||||
|
@ -170,7 +163,14 @@ PackagesView::~PackagesView()
|
|||
void
|
||||
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;
|
||||
rect.left = 1;
|
||||
rect.bottom = 15;
|
||||
rect.top = 0;
|
||||
BString lastGroup = "";
|
||||
for (int32 i=0; i<count; i++) {
|
||||
void *item = packages.ItemAt(i);
|
||||
|
@ -191,30 +192,30 @@ PackagesView::AddPackages(BList &packages, BMessage *msg)
|
|||
lastGroup = package->GroupName();
|
||||
Group *group = new Group();
|
||||
group->SetGroupName(package->GroupName());
|
||||
GroupView *view = new GroupView(rect, *group);
|
||||
GroupView *view = new GroupView(rect, group);
|
||||
AddChild(view);
|
||||
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->SetEnabled(!package->AlwaysOn());
|
||||
checkBox->SetMessage(msg);
|
||||
checkBox->SetMessage(new BMessage(*msg));
|
||||
AddChild(checkBox);
|
||||
rect.OffsetBy(0, 20);
|
||||
}
|
||||
ResizeTo(bounds.Width(), rect.bottom);
|
||||
ResizeTo(bounds.Width(), rect.top);
|
||||
|
||||
BScrollBar *vertScroller = ScrollBar(B_VERTICAL);
|
||||
|
||||
if (bounds.Height() > rect.top) {
|
||||
if (vertScroller->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->SetRange(0.0f, rect.top - vertScroller->Bounds().Height());
|
||||
vertScroller->SetProportion(vertScroller->Bounds().Height() / rect.top);
|
||||
}
|
||||
|
||||
vertScroller->SetSteps(15, bounds.Height());
|
||||
vertScroller->SetSteps(15, vertScroller->Bounds().Height());
|
||||
|
||||
Invalidate();
|
||||
}
|
||||
|
@ -232,3 +233,4 @@ PackagesView::GetTotalSizeAsString(char *string)
|
|||
}
|
||||
SizeAsString(size, string);
|
||||
}
|
||||
|
||||
|
|
|
@ -17,10 +17,10 @@ class Group {
|
|||
public:
|
||||
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; };
|
||||
private:
|
||||
char *fGroup;
|
||||
char fGroup[64];
|
||||
};
|
||||
|
||||
|
||||
|
@ -28,8 +28,8 @@ class Package : public Group {
|
|||
public:
|
||||
Package();
|
||||
virtual ~Package();
|
||||
void SetName(const char *name) { free(fName); fName=strdup(name);};
|
||||
void SetDescription(const char *description) { free(fDescription); fDescription=strdup(description);};
|
||||
void SetName(const char *name) { strcpy(fName, name);};
|
||||
void SetDescription(const char *description) { strcpy(fDescription, description);};
|
||||
void SetSize(const int32 size) { fSize = size; };
|
||||
void SetIcon(BBitmap * icon) { delete fIcon; fIcon = icon; };
|
||||
void SetOnByDefault(bool onByDefault) { fOnByDefault = onByDefault; };
|
||||
|
@ -44,8 +44,8 @@ public:
|
|||
|
||||
static Package *PackageFromEntry(BEntry &dir);
|
||||
private:
|
||||
char *fName;
|
||||
char *fDescription;
|
||||
char fName[64];
|
||||
char fDescription[64];
|
||||
int32 fSize;
|
||||
BBitmap *fIcon;
|
||||
bool fAlwaysOn, fOnByDefault;
|
||||
|
@ -54,20 +54,20 @@ private:
|
|||
|
||||
class PackageCheckBox : public BCheckBox {
|
||||
public:
|
||||
PackageCheckBox(BRect rect, Package &item);
|
||||
PackageCheckBox(BRect rect, Package *item);
|
||||
virtual ~PackageCheckBox();
|
||||
virtual void Draw(BRect update);
|
||||
Package *GetPackage() { return &fPackage; };
|
||||
Package *GetPackage() { return fPackage; };
|
||||
private:
|
||||
Package &fPackage;
|
||||
Package *fPackage;
|
||||
};
|
||||
|
||||
class GroupView : public BStringView {
|
||||
public:
|
||||
GroupView(BRect rect, Group &group);
|
||||
GroupView(BRect rect, Group *group);
|
||||
virtual ~GroupView();
|
||||
private:
|
||||
Group &fGroup;
|
||||
Group *fGroup;
|
||||
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue