This is ADController.m in view mode; [Download] [Up]
#import "../ADController.h"
#import <appkit/Button.h>
#import "ADSlave.h"
#import "../TVController.h"
#import "../PrefControl.h"
#define Stat_INIT 0
#define Stat_PLAY 1
#define Stat_PAUSE 2
#define Stat_QUIT 3
static id activePanel = nil;
@implementation ADController
#define Panel_X(n) (6.0 + ((n) % 4) * 16.0 + ((n) / 8) * 9.0)
#define Panel_Y(n) (400.0 - ((n) % 8) * 20.0)
/* Local Method */
- locatePanel
{
static int panelNum = 0;
[panel moveTopLeftTo: Panel_X(panelNum): Panel_Y(panelNum)];
++panelNum;
return self;
}
/* Local Method */
- jumpTo:(int) pos
{
[slider setIntValue: pos];
currentNum = pos;
[nextFile setStringValue: [dirlist filenameAt: pos]];
return self;
}
- init:sender dir:(const char *)dir with:(DirList *)list
{
int i, m;
[NXApp loadNibSection:"AutoDisplay.nib" owner:self];
dirlist = list;
status = Stat_INIT;
fileNum = [dirlist fileNumber];
[slider setMaxValue: (fileNum - 1)];
[sliderMax setIntValue: fileNum];
[[self locatePanel] jumpTo: 0];
for (i = m = 0; dir[i]; i++)
if (dir[i] == '/') m = i + 1;
[[[panel setTitle: &dir[m]] display] makeKeyAndOrderFront: self];
[[panel setFloatingPanel:YES] setWorksWhenModal:YES];
[panel setFreeWhenClosed:YES];
[[lButton setContinuous:YES] setPeriodicDelay:0.5 andInterval:0.2];
[[rButton setContinuous:YES] setPeriodicDelay:0.5 andInterval:0.2];
NXPing();
slave = [[ADSlave alloc] init:self with:sender dir:dir];
waiting = NO;
return self;
}
- free
{
[dirlist free];
[slave free];
[super free];
return nil;
}
/* Local Method */
- setButton:(int)stat
{
if (activePanel == self && stat != Stat_PLAY)
activePanel = nil; /* UNLOCKED */
[playButton setState:(stat == Stat_PLAY)];
[pauseButton setState:(stat == Stat_PAUSE)];
[quitButton setState:(stat == Stat_INIT)];
[stepButton setState:NO];
[slider setEnabled:(stat != Stat_PLAY)];
return self;
}
- pausePush:sender
{
[self setButton: (status = Stat_PAUSE)];
return self;
}
- playPush:sender
{
if (activePanel != nil && activePanel != self) {
[self setButton: status];
NXBeep();
return self;
}
activePanel = self; /* LOCKED */
[self setButton: Stat_PLAY];
if (status != Stat_PLAY) {
status = Stat_PLAY;
[slave perform:@selector(donext:) with:self
afterDelay: 300 cancelPrevious:YES];
waiting = YES;
}
return self;
}
- stepPush:sender
{
if (activePanel != nil && activePanel != self) {
[self setButton: status];
NXBeep();
return self;
}
activePanel = self; /* LOCKED */
[playButton setState: NO];
[pauseButton setState: NO];
[quitButton setState: NO];
status = Stat_PLAY;
[slave dostep:self];
[self setButton: (status = Stat_PAUSE)]; /* UNLOCKED */
[self sliderUp: self];
return self;
}
- quitPush:sender
{
[self setButton: Stat_INIT];
[panel close];
NXPing();
if (waiting) {
status = Stat_QUIT;
return self;
}
return [self free];
}
- sliderChange:sender
{
int n = [slider intValue];
if (currentNum != n)
[self jumpTo: n];
return self;
}
- sliderDown:sender
{
if (status != Stat_PLAY && currentNum > 0)
[self jumpTo: currentNum - 1];
return self;
}
- sliderUp:sender
{
if (status != Stat_PLAY && currentNum < fileNum-1)
[self jumpTo: currentNum + 1];
return self;
}
- (const char *)nextFilename
{
return (status == Stat_PLAY) ? [dirlist filenameAt: currentNum] : NULL;
}
- continueLoop:(BOOL)cont
{
int intv;
if (status == Stat_QUIT) return [self free];
if (!cont) {
waiting = NO;
return self;
}
if (currentNum >= fileNum-1) {
[self pausePush: self];
waiting = NO;
return self;
}
[self jumpTo: currentNum + 1];
intv = (thePreference) ? [thePreference autoDisplayInterval] : 2500;
[slave perform:@selector(donext:) with:self
afterDelay: intv cancelPrevious:YES];
waiting = YES;
return self;
}
- (BOOL) scanFixPosition
{
return ([thePreference windowPosition] == pos_FixScan);
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.