Added progress bar and message for overall status of components being installed. Also, we now display the icon for the folder or volume selected to install, including custom folder and disk icons. Added Quit menu and cmd+Quit keyboard handling. [r=ssu]

This commit is contained in:
sgehani%netscape.com 1999-11-11 00:29:38 +00:00
parent 4130b8bf80
commit 1dba02fca2
10 changed files with 231 additions and 107 deletions

View File

@ -108,42 +108,61 @@ void HandleKeyDown(EventRecord* evt)
if ( (keyPressed == 'z') || (keyPressed == 'Z'))
gDone = true; // backdoor exit
#endif
if (keyPressed == '\r') //dougt: what about tab, esc, arrows, doublebyte?
switch(keyPressed) //dougt: what about tab, esc, arrows, doublebyte?
{
switch(gCurrWin)
{
case kLicenseID:
KillControls(gWPtr);
ShowWelcomeWin();
return;
case kWelcomeID:
KillControls(gWPtr);
ShowSetupTypeWin();
return;
case kSetupTypeID:
KillControls(gWPtr);
/* treat last setup type selection as custom */
if (gControls->opt->instChoice == gControls->cfg->numSetupTypes)
ShowComponentsWin();
else
{
case '\r':
switch(gCurrWin)
{
case kLicenseID:
KillControls(gWPtr);
ShowWelcomeWin();
return;
case kWelcomeID:
KillControls(gWPtr);
ShowSetupTypeWin();
return;
case kSetupTypeID:
KillControls(gWPtr);
/* treat last setup type selection as custom */
if (gControls->opt->instChoice == gControls->cfg->numSetupTypes)
ShowComponentsWin();
else
{
ClearDiskSpaceMsgs();
ShowTerminalWin();
}
return;
case kComponentsID:
KillControls(gWPtr);
gControls->cw->compListBox.top = 0;
EraseRect(&gControls->cw->compListBox);
ClearDiskSpaceMsgs();
ShowTerminalWin();
}
return;
case kComponentsID:
KillControls(gWPtr);
gControls->cw->compListBox.top = 0;
EraseRect(&gControls->cw->compListBox);
ClearDiskSpaceMsgs();
ShowTerminalWin();
return;
case kTerminalID:
SpawnSDThread(Install, &tid);
return;
return;
case kTerminalID:
SpawnSDThread(Install, &tid);
return;
default:
break; // never reached
}
break;
default:
break;
}
if ( (evt->modifiers & cmdKey) != 0 )
{
switch(keyPressed)
{
case 'Q':
case 'q':
gDone = true;
break;
default:
break; // never reached
break;
}
}
}
@ -161,7 +180,12 @@ void HandleMenuChoice(SInt32 aChoice)
Alert(rAboutBox, nil);
}
break;
case mFile:
if (menuItem == iQuit)
gDone = true;
break;
default:
break;
}

View File

@ -522,39 +522,51 @@ InitProgressBar(void)
{
SetPort(gWPtr);
gControls->tw->progressBar = NULL;
gControls->tw->progressBar = GetNewControl(rInstProgBar, gWPtr);
if (gControls->tw->progressBar)
gControls->tw->allProgressBar = NULL;
gControls->tw->allProgressBar = GetNewControl(rAllProgBar, gWPtr);
gControls->tw->xpiProgressBar = NULL;
gControls->tw->xpiProgressBar = GetNewControl(rPerXPIProgBar, gWPtr);
if (gControls->tw->allProgressBar && gControls->tw->xpiProgressBar)
{
SetControlData(gControls->tw->progressBar, kControlNoPart, kControlProgressBarIndeterminateTag,
/* init overall prog indicator */
SetControlData(gControls->tw->allProgressBar, kControlNoPart, kControlProgressBarIndeterminateTag,
sizeof(indeterminateFlag), (Ptr) &indeterminateFlag);
Draw1Control(gControls->tw->progressBar);
Draw1Control(gControls->tw->allProgressBar);
gControls->tw->progressMsg = NULL;
HLock((Handle)gControls->tw->progressBar);
SetRect(&r, (*gControls->tw->progressBar)->contrlRect.left,
(*gControls->tw->progressBar)->contrlRect.top - 42,
(*gControls->tw->progressBar)->contrlRect.right,
(*gControls->tw->progressBar)->contrlRect.top - 26 );
HUnlock((Handle)gControls->tw->progressBar);
gControls->tw->progressMsg = TENew(&r, &r);
if (gControls->tw->progressMsg)
/* init xpi package name display */
gControls->tw->allProgressMsg = NULL;
HLock((Handle)gControls->tw->allProgressBar);
SetRect(&r, (*gControls->tw->allProgressBar)->contrlRect.left,
(*gControls->tw->allProgressBar)->contrlRect.top - 21,
(*gControls->tw->allProgressBar)->contrlRect.right,
(*gControls->tw->allProgressBar)->contrlRect.top - 5 );
HUnlock((Handle)gControls->tw->allProgressBar);
gControls->tw->allProgressMsg = TENew(&r, &r);
if (gControls->tw->allProgressMsg)
{
GetIndString(extractingStr, rStringList, sExtracting);
TEInsert(&extractingStr[1], extractingStr[0], gControls->tw->progressMsg);
TEInsert(&extractingStr[1], extractingStr[0], gControls->tw->allProgressMsg);
}
/* init per xpi prog indicator */
SetControlData(gControls->tw->xpiProgressBar, kControlNoPart, kControlProgressBarIndeterminateTag,
sizeof(indeterminateFlag), (Ptr) &indeterminateFlag);
HideControl(gControls->tw->xpiProgressBar);
TextFace(normal);
TextSize(9);
TextFont(applFont);
gControls->tw->xpiProgressMsg = NULL; /* used by XPInstall progress callback */
HLock((Handle)gControls->tw->progressBar);
SetRect(&r, (*gControls->tw->progressBar)->contrlRect.left,
(*gControls->tw->progressBar)->contrlRect.top - 42,
(*gControls->tw->progressBar)->contrlRect.right,
(*gControls->tw->progressBar)->contrlRect.top - 5 );
HUnlock((Handle)gControls->tw->progressBar);
HLock((Handle)gControls->tw->xpiProgressBar);
SetRect(&r, (*gControls->tw->xpiProgressBar)->contrlRect.left,
(*gControls->tw->xpiProgressBar)->contrlRect.top - 21,
(*gControls->tw->xpiProgressBar)->contrlRect.right,
(*gControls->tw->xpiProgressBar)->contrlRect.top - 5 );
HUnlock((Handle)gControls->tw->xpiProgressBar);
gControls->tw->xpiProgressMsg = TENew(&r, &r);
TextFont(systemFont); /* restore systemFont */

View File

@ -221,12 +221,7 @@ void MakeMenus(void)
}
else
ErrorHandler();
if ( (menuHdl = GetMenuHandle(mFile)) != nil)
DisableItem(menuHdl, 0);
else
ErrorHandler();
if ( (menuHdl = GetMenuHandle(mEdit)) != nil)
DisableItem(menuHdl, 0);
else

View File

@ -30,12 +30,14 @@
#include <Navigation.h>
#include <MacTypes.h>
#include <PLStringFuncs.h>
#include <Icons.h>
#include "FullPath.h"
#include "MoreFilesExtras.h"
#include "Threads.h"
/*-----------------------------------------------------------*
* SBI: SmartDownload administration
*-----------------------------------------------------------*/
@ -150,7 +152,8 @@ if (err) \
#define rCheckboxLDEF 128
#define rStartMsgBox 160
#define rInstProgBar 161
#define rAllProgBar 161
#define rPerXPIProgBar 162
#define rMBar 128 /* menu rsrc ids */
@ -191,7 +194,8 @@ if (err) \
#define sExtracting 23
#define sInstalling 24
#define sFileSp 25
#define sSpOfSp 26
#define sSpOfSp 26
#define sProcessing 27
#define rTitleStrList 170
#define sNSInstTitle 1 /* end i18n strings */
@ -369,8 +373,9 @@ typedef struct CompWin {
typedef struct TermWin {
TEHandle startMsg;
Rect startMsgBox;
ControlHandle progressBar;
TEHandle progressMsg;
ControlHandle allProgressBar;
TEHandle allProgressMsg;
ControlHandle xpiProgressBar;
TEHandle xpiProgressMsg;
} TermWin;

View File

@ -272,9 +272,9 @@ InSetupTypeContent(EventRecord* evt, WindowPtr wCurrPtr)
** Whilst, the -folder- string is used by DrawDiskNFolder() in repainting.
*/
pstrcpy(gControls->opt->folder, folderSpec.name);
DrawDiskNFolder(folderSpec.vRefNum, folderSpec.name);
gControls->opt->vRefNum = tmp.vRefNum;
gControls->opt->dirID = tmp.parID;
DrawDiskNFolder(folderSpec.vRefNum, folderSpec.name);
}
AEDisposeDesc(&resultDesc);
@ -325,10 +325,13 @@ DrawDiskNFolder(short vRefNum, unsigned char *folder)
{
Str255 inFolderMsg, onDiskMsg, volName;
char *cstr;
Rect viewRect, dlb;
Rect viewRect, dlb, iconRect;
TEHandle pathInfo;
short bCmp;
OSErr err = noErr;
FSSpec fsTarget;
IconRef icon;
SInt16 label;
/* get vol and folder name */
if ((err = GetVol(volName, &vRefNum)) == noErr)
@ -376,6 +379,17 @@ DrawDiskNFolder(short vRefNum, unsigned char *folder)
TextSize(12);
}
/* draw folder/volume icon */
FSMakeFSSpec(gControls->opt->vRefNum, gControls->opt->dirID, "\p", &fsTarget);
err = GetIconRefFromFile(&fsTarget, &icon, &label);
if (err==noErr)
{
#define ICON_DIM 32
SetRect(&iconRect, viewRect.left+70, viewRect.top+10, viewRect.left+70+ICON_DIM, viewRect.top+10+ICON_DIM);
PlotIconRef(&iconRect, kAlignNone, kTransformNone, kIconServicesNormalUsageFlag, icon);
}
ReleaseIconRef(icon);
/* free mem blocks */
TEDispose(pathInfo);

View File

@ -90,16 +90,16 @@ UpdateTerminalWin(void)
SetPort(gWPtr);
TEUpdate(&gControls->tw->startMsgBox, gControls->tw->startMsg);
if (gControls->tw->progressMsg)
if (gControls->tw->allProgressMsg)
{
HLock((Handle)gControls->tw->progressMsg);
SetRect(&instMsgRect, (*gControls->tw->progressMsg)->viewRect.left,
(*gControls->tw->progressMsg)->viewRect.top,
(*gControls->tw->progressMsg)->viewRect.right,
(*gControls->tw->progressMsg)->viewRect.bottom );
HUnlock((Handle)gControls->tw->progressMsg);
HLock((Handle)gControls->tw->allProgressMsg);
SetRect(&instMsgRect, (*gControls->tw->allProgressMsg)->viewRect.left,
(*gControls->tw->allProgressMsg)->viewRect.top,
(*gControls->tw->allProgressMsg)->viewRect.right,
(*gControls->tw->allProgressMsg)->viewRect.bottom );
HUnlock((Handle)gControls->tw->allProgressMsg);
TEUpdate(&instMsgRect, gControls->tw->progressMsg);
TEUpdate(&instMsgRect, gControls->tw->allProgressMsg);
}
SetPort(oldPort);

View File

@ -29,12 +29,12 @@
* XPInstall Glue
*-----------------------------------------------------------*/
/* XPI Stub Entry Points */
/*================== XPI Stub Entry Points ================== */
typedef nsresult (*XPI_InitProc)(const FSSpec& aXPIStubDir, const FSSpec& aProgramDir, pfnXPIProgress progressCB);
typedef nsresult (*XPI_InstallProc)(const FSSpec& file, const char* args,long flags);
typedef nsresult (*XPI_ExitProc)();
/* XPI Run APIs */
/*================== XPI Run APIs ============================*/
OSErr LoadXPIStub(XPI_InitProc* pfnInit,
XPI_InstallProc* pfnInstall,
XPI_ExitProc* pfnExit,
@ -42,19 +42,20 @@ OSErr LoadXPIStub(XPI_InitProc* pfnInit,
FSSpec& aTargetDir);
Boolean UnloadXPIStub(CFragConnectionID* connID);
OSErr RunXPI(FSSpec&, XPI_InstallProc*);
int CountSelectedXPIs();
Boolean IsArchiveXPI(StringPtr archive);
void ProgressMsgInit();
/* Progress Bar Callbacks */
/*================== Progress Bar Callbacks ==================*/
void xpicbProgress(const char* msg, PRInt32 val, PRInt32 max);
/*================== Macros ==================================*/
#define XPI_ERR_CHECK(_call) \
rv = _call; \
if (NS_FAILED(rv)) \
{ \
ErrorHandler(); \
return rv; \
return rv; \
}
#ifdef MIW_DEBUG
@ -71,14 +72,16 @@ ProgressMsgInit()
{
Rect r;
if (gControls->tw->progressMsg)
if (gControls->tw->allProgressMsg)
{
HLock((Handle)gControls->tw->progressMsg);
SetRect(&r, (*gControls->tw->progressMsg)->viewRect.left,
(*gControls->tw->progressMsg)->viewRect.top,
(*gControls->tw->progressMsg)->viewRect.right,
(*gControls->tw->progressMsg)->viewRect.bottom );
HUnlock((Handle)gControls->tw->progressMsg);
HLock((Handle)gControls->tw->allProgressMsg);
SetRect(&r, (*gControls->tw->allProgressMsg)->viewRect.left,
(*gControls->tw->allProgressMsg)->viewRect.top,
(*gControls->tw->allProgressMsg)->viewRect.right,
(*gControls->tw->allProgressMsg)->viewRect.bottom );
HUnlock((Handle)gControls->tw->allProgressMsg);
TESetText("", 0, gControls->tw->allProgressMsg);
EraseRect(&r);
}
@ -103,16 +106,20 @@ xpicbProgress(const char* msg, PRInt32 val, PRInt32 max)
if (gWPtr)
{
SetPort(gWPtr);
if (gControls->tw->progressBar)
if (gControls->tw->xpiProgressBar)
{
if (!bProgMsgInit)
ProgressMsgInit();
if (max!=0 && !bMaxDiscovered)
{
SetControlData(gControls->tw->progressBar, kControlNoPart, kControlProgressBarIndeterminateTag,
SetControlData(gControls->tw->xpiProgressBar, kControlNoPart, kControlProgressBarIndeterminateTag,
sizeof(indeterminateFlag), (Ptr) &indeterminateFlag);
SetControlMaximum(gControls->tw->progressBar, max);
SetControlMaximum(gControls->tw->xpiProgressBar, max);
if (gControls->tw->allProgressBar)
SetControlValue(gControls->tw->allProgressBar,
GetControlValue(gControls->tw->allProgressBar)+1);
bMaxDiscovered = true;
}
else if (!bMaxDiscovered)
@ -131,7 +138,7 @@ xpicbProgress(const char* msg, PRInt32 val, PRInt32 max)
{
EraseRect(&r);
GetIndString(installingStr, rStringList, sInstalling);
GetIndString(installingStr, rStringList, sProcessing);
leaf = strrchr(msg, ':');
if (leaf)
{
@ -162,11 +169,11 @@ xpicbProgress(const char* msg, PRInt32 val, PRInt32 max)
if (bMaxDiscovered)
{
SetControlValue(gControls->tw->progressBar, val);
SetControlValue(gControls->tw->xpiProgressBar, val);
if (gControls->tw->xpiProgressMsg)
{
GetIndString(installingStr, rStringList, sInstalling);
GetIndString(installingStr, rStringList, sProcessing);
GetIndString(fileStr, rStringList, sFileSp);
GetIndString(ofStr, rStringList, sSpOfSp);
HLock((Handle)gControls->tw->xpiProgressMsg);
@ -214,8 +221,9 @@ RunAllXPIs(short xpiVRefNum, long xpiDirID, short vRefNum, long dirID)
CFragConnectionID connID;
nsresult rv = NS_OK;
StringPtr pcurrArchive;
int i, compsDone = 0, instChoice = gControls->opt->instChoice-1;;
Boolean isCurrXPI = false;
int i, len, compsDone = 0, numXPIs, currXPICount = 0, instChoice = gControls->opt->instChoice-1;
Boolean isCurrXPI = false, indeterminateFlag = false;
Str255 installingStr;
err = FSMakeFSSpec(vRefNum, dirID, 0, &xpiStubDirSpec); /* temp dir */
err = FSMakeFSSpec(gControls->opt->vRefNum, gControls->opt->dirID, 0, &tgtDirSpec); /* program dir */
@ -223,6 +231,20 @@ RunAllXPIs(short xpiVRefNum, long xpiDirID, short vRefNum, long dirID)
ERR_CHECK_RET(LoadXPIStub(&xpi_initProc, &xpi_installProc, &xpi_exitProc, &connID, xpiStubDirSpec), err);
XPI_ERR_CHECK(xpi_initProc( xpiStubDirSpec, tgtDirSpec, xpicbProgress ));
// init overall xpi indicator
numXPIs = CountSelectedXPIs();
if (gControls->tw->allProgressBar)
{
SetControlMaximum(gControls->tw->allProgressBar, numXPIs*2); // numXPIs * 2 so that prog bar moves more
SetControlData(gControls->tw->allProgressBar, kControlNoPart, kControlProgressBarIndeterminateTag,
sizeof(indeterminateFlag), (Ptr) &indeterminateFlag);
SetControlValue(gControls->tw->allProgressBar, 0);
Draw1Control(gControls->tw->allProgressBar);
}
if (gControls->tw->xpiProgressBar)
ShowControl(gControls->tw->xpiProgressBar);
// enumerate through all .xpi's
// loop through 0 to kMaxComponents
for(i=0; i<kMaxComponents; i++)
@ -239,17 +261,38 @@ RunAllXPIs(short xpiVRefNum, long xpiDirID, short vRefNum, long dirID)
{
// if LAUNCHAPP attr wasn't set
if (!gControls->cfg->comp[i].launchapp)
HLock(gControls->cfg->comp[i].archive);
pcurrArchive = CToPascal(*gControls->cfg->comp[i].archive);
HUnlock(gControls->cfg->comp[i].archive);
isCurrXPI = IsArchiveXPI(pcurrArchive);
err = FSMakeFSSpec(xpiVRefNum, xpiDirID, pcurrArchive, &xpiSpec);
if (err==noErr && isCurrXPI)
RunXPI(xpiSpec, &xpi_installProc);
if (pcurrArchive)
DisposePtr((Ptr) pcurrArchive);
{
HLock(gControls->cfg->comp[i].archive);
pcurrArchive = CToPascal(*gControls->cfg->comp[i].archive);
HUnlock(gControls->cfg->comp[i].archive);
isCurrXPI = IsArchiveXPI(pcurrArchive);
err = FSMakeFSSpec(xpiVRefNum, xpiDirID, pcurrArchive, &xpiSpec);
if (err==noErr && isCurrXPI)
{
// update package display name
if (gControls->tw->allProgressMsg)
{
ProgressMsgInit();
GetIndString(installingStr, rStringList, sInstalling);
TEInsert(&installingStr[1], installingStr[0], gControls->tw->allProgressMsg);
HLock(gControls->cfg->comp[i].shortDesc);
len = strlen(*gControls->cfg->comp[i].shortDesc);
TEInsert(*gControls->cfg->comp[i].shortDesc, (len>64?64:len), gControls->tw->allProgressMsg);
HUnlock(gControls->cfg->comp[i].shortDesc);
}
RunXPI(xpiSpec, &xpi_installProc);
// update progess bar
if (gControls->tw->allProgressBar)
SetControlValue(gControls->tw->allProgressBar,
GetControlValue(gControls->tw->allProgressBar)+1);
}
if (pcurrArchive)
DisposePtr((Ptr) pcurrArchive);
}
compsDone++;
}
}
@ -274,8 +317,8 @@ RunXPI(FSSpec& aXPI, XPI_InstallProc *xpi_installProc)
/* reset progress bar to barber poll */
bMaxDiscovered = false;
if (gControls->tw->progressBar)
SetControlData(gControls->tw->progressBar, kControlNoPart, kControlProgressBarIndeterminateTag,
if (gControls->tw->xpiProgressBar)
SetControlData(gControls->tw->xpiProgressBar, kControlNoPart, kControlProgressBarIndeterminateTag,
sizeof(indeterminateFlag), (Ptr) &indeterminateFlag);
if (NS_FAILED(rv))
return -1;
@ -284,6 +327,37 @@ RunXPI(FSSpec& aXPI, XPI_InstallProc *xpi_installProc)
return err;
}
int
CountSelectedXPIs()
{
int i, instChoice = gControls->opt->instChoice - 1, compsDone = 0, numXPIs = 0;
// enumerate through all .xpi's
// loop through 0 to kMaxComponents
for(i=0; i<kMaxComponents; i++)
{
// general test: if component in setup type
if ( (gControls->cfg->st[instChoice].comp[i] == kInSetupType) &&
(compsDone < gControls->cfg->st[instChoice].numComps) )
{
// if custom and selected, or not custom setup type
// add file to buffer
if ( ((instChoice == gControls->cfg->numSetupTypes-1) &&
(gControls->cfg->comp[i].selected == true)) ||
(instChoice < gControls->cfg->numSetupTypes-1) )
{
// if LAUNCHAPP attr wasn't set
if (!gControls->cfg->comp[i].launchapp)
numXPIs++;
}
}
else if (compsDone >= gControls->cfg->st[instChoice].numComps)
break;
}
return numXPIs;
}
/*-------------------------------------------------------------------
* XPI Stub Load/Unload
*-------------------------------------------------------------------*/