This is Progress.m in view mode; [Download] [Up]
/******************************************************************************
FILE: Progress.m
LANGUAGE: Objective-C
SYSTEM: UNIX
USER-INTERFACE: NEXTSTEP
DESCRIPTION
This object creates a small window to display the progress made in filling
a file. It probes the size of the file periodically until it's greater than
a target size.
AUTHORS
<PJB> Pascal J. Bourguignon
MODIFICATIONS
1998/08/12 <PJB> Creation.
BUGS
LEGAL
Copyright Pascal J. Bourguignon 1998 - 1998
The GNU GENERAL PUBLIC LICENSE applies to this software.
See the file named "COPYING".
******************************************************************************/
#import "Progress.h"
#import "DragBackgroundView.h"
#import "BarGauge.h"
#import <sys/types.h>
#import <sys/stat.h>
static void timedEntryHandler(DPSTimedEntry tag,double now,void *userData)
{
Progress* progress=(Progress*)userData;
[progress tick];
}//timedEntryHandler;
@implementation Progress
-(id)initWithPath:(const char*)filePath expectedSize:(size_t)expectedSize
{
self=[super init];
if(self!=0){
window=0;
gauge=0;
ticking=NO;
path=filePath;
targetSize=expectedSize;
}
return(self);
}//initWithPath:expectedSize:;
-(id)appDidInit:sender
{
[NXApp setDelegate:0];
[self start];
return(0);
}//appDidInit:;
-(id)free
{
[self stop];
if(window!=[NXApp appIcon]){
[window performClose:self];
}
return([super free]);
}//free;
-(BOOL)fileExists
{
struct stat status;
int res=stat(path,&status);
if(res==0){
return((status.st_mode&S_IFMT)==S_IFREG);
}else{
return(NO);
}
}//fileExists;
-(size_t)getFileSize
{
struct stat status;
stat(path,&status);
return(status.st_size);
}//getFileSize;
-(void)start
{
if(!ticking){
[self makeWindow];
timedEntry=DPSAddTimedEntry(1.0,timedEntryHandler,
(void*)self,NX_BASETHRESHOLD);
ticking=YES;
}
}//start;
-(void)tick
{
size_t size=[self getFileSize];
[gauge setDoubleValue:(double)size];
if(size>=targetSize){
[self targetReached];
[self stop];
}
}//tick;
-(void)stop
{
if(ticking){
DPSRemoveTimedEntry(timedEntry);
ticking=NO;
}
}//stop;
-reachedAction:sender
{
[self free];
return([NXApp terminate:sender]);
}//reachedAction:;
-(void)makeWindow
{
//Let's canibalize the Application window.
NXRect rect;
DragBackgroundView* contentView;
ButtonCell* contentCell;
TextField* nameText;
[[NXApp appIcon]getFrame:&rect];
rect.size.width*=4.0;
window=[[Window alloc]initContent:&rect
style:NX_PLAINSTYLE
backing:NX_BUFFERED
buttonMask:0
defer:NO];
[window setFreeWhenClosed:YES];
[window setBackgroundGray:NX_LTGRAY];
rect.origin.x=0.0;
rect.origin.y=0.0;
contentView=[[DragBackgroundView alloc]initFrame:&rect];
[window setContentView:contentView];
[window getFrame:&rect];
rect.origin.x=10.0;
rect.origin.y=46.0;
rect.size.width-=20.0;
rect.size.height=16.0;
nameText=[[TextField alloc]initFrame:&rect];
[nameText setEditable:NO];
[nameText setEnabled:NO];
[nameText setSelectable:YES];
[nameText setBordered:NO];
[nameText setTextGray:NX_BLACK];
[nameText setBackgroundGray:NX_LTGRAY];
[nameText setStringValue:path];
[contentView addSubview:nameText];
[window getFrame:&rect];
rect.origin.x=10.0;
rect.origin.y=24.0;
rect.size.width-=20.0;
rect.size.height=22.0;
gauge=[[BarGauge alloc]initFrame:&rect];
[gauge setBorderType:NX_RIDGE];
//[gauge setLabelTicsEnable:YES];
//[gauge setBorderType:NX_NOBORDER];
[gauge setAutoScaleEnable:NO];
[gauge setTicsEnable:YES];
[gauge setLowThresh:0.0 HighThresh:0.95 AndQuanta:0];
[gauge setMajorTics:10];
[gauge setStartValue:0.0];
[gauge setTicSize:((double)targetSize)/((double)[gauge majorTics])];
[gauge setEnabled:NO];
[gauge setDoubleValue:0.0];
[contentView addSubview:gauge];
[window display];
[window makeKeyAndOrderFront:self];
[[NXApp appIcon]orderOut:self];
}//makeWindow;
-(void)targetReached
{
NXRect rect;
Button* reached;
[window getFrame:&rect];
rect.origin.x=10.0;
rect.origin.y=4.0;
rect.size.width-=20.0;
rect.size.height=16.0;
reached=[[Button alloc]initFrame:&rect
title:"File complete! Quit"
tag:0
target:self
action:@selector(reachedAction:)
key:0
enabled:YES];
[[window contentView]addSubview:reached];
[window display];
}//targetReached;
@end //Progress.
/*** Progress.m / Wed Aug 12 03:59:35 MET 1998 / PJB ***/
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.