This is Controller.m in view mode; [Download] [Up]
#import "Controller.h"
#import <appkit/Application.h>
#import <appkit/OpenPanel.h>
#import <appkit/SavePanel.h>
#import <objc/List.h>
#import <appkit/Form.h>
#import <appkit/Matrix.h>
#import <appkit/Panel.h>
#import "FooObject.h"
#import "CellScrollView.h"
#import "FooCell.h"
#import <fcntl.h>
#import <strings.h>
#import <libc.h>
#import "VISCA.h"
#import "ViscaController.h"
@implementation Controller
- appDidInit:sender
{
/*
[self addFooObject:self];
[cellScrollView loadCellsFrom:fooObjects];
cellMatrix = [cellScrollView cellMatrix];
*/
[viscaController appDidInit: sender];
return self;
}
- initVars
{
fprintf(stderr,"App did init\n");
fooObjects = [[List alloc] init];
didInit = NO;
return self;
}
- free
{
[fooObjects free];
return [super free];
}
- addFooObject:sender
{
struct ct_hmsf start, end;
const char *buf1, *buf2;
FooObject *fooObject;
int count1, count2;
int h, m, s, f;
buf1 = [framePositionMatrix stringValueAt: 0];
fprintf( stderr, "Pos1 string = <%s>\n", buf1);
count1 = sscanf( buf1, "%x:%x:%x:%x", &h,
&m, &s, &f);
start.hh = h;
start.mm = m;
start.ss = s;
start.ff = 0;
buf2 = [framePositionMatrix stringValueAt: 1];
fprintf( stderr, "Pos2 string = <%s>\n", buf2);
count2 = sscanf( buf2, "%x:%x:%x:%x",&h,
&m, &s, &f);
end.hh = h;
end.mm = m;
end.ss = s;
end.ff = 0;
fprintf(stderr,"Start (%d) %02X:%02X:%02X:%02X "
"->End (%d) %02X:%02X:%02X:%02X\n\n",
count1, start.hh, start.mm, start.ss, start.ff,
count2, end.hh, end.mm, end.ss, end.ff);
if( count1 < 2 || count2 < 2)
{
NXRunAlertPanel("Improper Format", "The start or "
"end frames have not been filled out.",
"OK", NULL, NULL);
return nil;
}
fooObject = [[FooObject alloc] init];
[fooObject setStartFrame: &start];
[fooObject setEndFrame: &end];
[fooObject setComment: [commentText stringValue]];
[fooObjects addObject:fooObject];
[cellScrollView loadCellsFrom:fooObjects];
/*
* Assumptions in this next line:
* There are as many fooCells as there are fooObjects
* We've added the new fooObject at the end of the list.
* We want to display the fooObject we just added and highlight it.
* In short, this is a hack.
*/
[cellMatrix scrollCellToVisible:[fooObjects count]-1 :0];
[cellMatrix selectCellAt:[fooObjects count]-1:0];
if( didInit == NO )
{
[cellScrollView loadCellsFrom:fooObjects];
cellMatrix = [cellScrollView cellMatrix];
didInit = YES;
}
return self;
}
- deleteFooObjects:sender
/*
* Delete all selected fooObjects.
*/
{
int i;
for (i=[cellMatrix cellCount]-1; i>=0; i--) {
FooCell *cell = [cellMatrix cellAt:i:0];
if ([cell isHighlighted]) {
/*
* If a cell is highlighted, remove (and free) the corresponding item
* from the list of fooObjects.
*/
[[fooObjects removeObject:[cell fooObject]] free];
}
}
[cellScrollView loadCellsFrom:fooObjects];
return self;
}
- deleteAllFooObjects:sender
/*
* Delete all fooObjects.
*/
{
int i;
for (i=[cellMatrix cellCount]-1; i>=0; i--)
{
FooCell *cell = [cellMatrix cellAt:i:0];
[[fooObjects removeObject:[cell fooObject]] free];
}
[cellScrollView loadCellsFrom:fooObjects];
return self;
}
- moveUpObject: sender
{
int i;
for (i=1; i <= [cellMatrix cellCount]-1; i++)
{
FooCell *cell = [cellMatrix cellAt:i:0];
if ([cell isHighlighted])
{
[fooObjects insertObject: [fooObjects
removeObject:[cell fooObject]]
at: i - 1];
break;
}
}
[cellScrollView loadCellsFrom:fooObjects];
return self;
}
- moveDownObject: sender
{
int i;
for (i=0; i <= [cellMatrix cellCount]-2; i++)
{
FooCell *cell = [cellMatrix cellAt:i:0];
if ([cell isHighlighted])
{
[fooObjects insertObject:
[fooObjects removeObject:[cell fooObject]]
at: i + 1];
break;
}
}
[cellScrollView loadCellsFrom:fooObjects];
return self;
}
- setFrame: sender
{
[framePositionMatrix setStringValue:
[frameCounter stringValueAt: 0]
at: [sender tag]];
return self;
}
- searchFrame: sender
{
struct ct_hmsf search;
const char *buf;
int count, h, m, s, f;
buf = [framePositionMatrix stringValueAt: [sender tag]];
fprintf( stderr, "Search string = <%s>\n", buf);
count = sscanf( buf, "%x:%x:%x:%x", &h, &m, &s, &f);
search.hh = h;
search.mm = m;
search.ss = s;
search.ff = f;
if( count == 3 ) search.ff = 0;
if( count < 3 )
{
NXRunAlertPanel("Invalid field", "Invalid search field",
"OK", NULL, NULL);
return nil;
}
fprintf(stderr,"Searching (step 1) %02x:%02x:%02x:%02x\n",
search.hh, search.mm, search.ss, search.ff);
if( ([viscaController search: &search]) == CMD_ERROR )
{
NXRunAlertPanel( "Command error", "Command could "
"not execute for some reason.", "OK", NULL, NULL);
return nil;
}
return self;
}
- playFrames: sender
{
int i;
FooObject *fooObject;
struct ct_hmsf startFrame, endFrame;
fprintf(stderr, "Playing frames (%d).\n", [fooObjects count]);
[viscaController stop: sender];
for( i = 0; ; i++ )
{
fooObject = [fooObjects objectAt: i];
if( fooObject == nil)
break;
startFrame = *[fooObject startFrame];
endFrame = *[fooObject endFrame];
[viscaController search: &startFrame];
[viscaController waitUntil: &startFrame];
[viscaController play: sender];
[viscaController waitUntil: &endFrame];
[viscaController pause: sender];
fprintf(stderr, "Object %d:\n"
"\tStart frame %02x:%02x:%02x:%02x\n"
"\tEnd frame %02x:%02x:%02x:%02x\n\n",
i,
startFrame.hh, startFrame.mm,
startFrame.ss, startFrame.ff,
endFrame.hh, endFrame.mm,
endFrame.ss, endFrame.ff);
}
return self;
}
- openFile: sender
{
OpenPanel *openPanel;
const char *fileTypes[] = {"vbox", NULL};
const char *dir;
const char * const *filenames;
int counter;
openPanel = [OpenPanel new];
[openPanel allowMultipleFiles: NO];
if( ![openPanel runModalForTypes: fileTypes] )
return nil;
dir = [openPanel directory];
filenames = [openPanel filenames];
#ifdef DEBUG
fprintf(stderr, "Opening in directory <%s>:\n", dir);
#endif
for( counter = 0; filenames[counter] != NULL; counter ++)
{
char temp[1024];
const char *type;
#ifdef DEBUG
fprintf(stderr, "\t\t<%s>\n", filenames[counter]);
#endif
type = strrchr(filenames[counter], '.') + 1;
sprintf(temp, "%s/%s", dir, filenames[counter] );
[self app: self openFile: temp type: type];
}
return self;
}
- (BOOL) appAcceptsAnotherFile: sender
{
return YES;
}
- (int) app: sender openFile: (const char *) fname type: (const char *) ftype
{
struct ct_hmsf start, end;
FooObject *fooObject;
fprintf(stderr, "Opening file %s, type %s.\n",
fname, ftype);
if( strncmp( ftype, "vbox", 4 ) == 0 )
{
FILE *fp;
char input[256];
int count;
int h1, m1, s1, f1, h2, m2, s2, f2;
char comment[256];
[self deleteAllFooObjects: self];
fp = fopen( fname, "r" );
while( fgets( input, 255, fp) != NULL )
{
count = sscanf( input, "%x:%x:%x:%x %x:%x:%x:%x "
"%[^\n]s",
&h1, &m1, &s1, &f1,
&h2, &m2, &s2, &f2, comment);
fprintf(stderr,"Read %s: %02x:%02x:%02x:%02x "
"%02x:%02x:%02x:%02x %s\n\n",
fname,
h1, m1, s1, f1, h2, m2, s2, f2, comment);
start.hh = h1;
start.mm = m1;
start.ss = s1;
start.ff = f1;
end.hh = h2;
end.mm = m2;
end.ss = s2;
end.ff = f2;
fprintf(stderr,"Start %02X:%02X:%02X:%02X "
"->End %02X:%02X:%02X:%02X\n\n",
start.hh, start.mm, start.ss, start.ff,
end.hh, end.mm, end.ss, end.ff);
fooObject = [[FooObject alloc] init];
[fooObject setStartFrame: &start];
[fooObject setEndFrame: &end];
[fooObject setComment: comment];
[fooObjects addObject:fooObject];
[cellScrollView loadCellsFrom:fooObjects];
[cellMatrix scrollCellToVisible:
[fooObjects count]-1 :0];
[cellMatrix selectCellAt:[fooObjects count]-1:0];
if( didInit == NO )
{
[cellScrollView loadCellsFrom:fooObjects];
cellMatrix = [cellScrollView cellMatrix];
didInit = YES;
}
}
return YES;
}
return NO;
}
- saveFile: sender
{
int i;
SavePanel *savePanel;
char d[1024], f[1024], *comment;
FILE *fp;
FooObject *fooObject;
struct ct_hmsf startFrame, endFrame;
if( savePanel != nil )
savePanel = [SavePanel new];
if (![savePanel runModalForDirectory: "~"
file: "Untitled" ] )
return nil;
strcpy( d, [savePanel directory] );
strcpy( f, [savePanel filename] );
fprintf(stderr, "Saving at dir %s, file %s.\n\n", d, f);
if( (access(d, F_OK) == 0) && (access( d, W_OK) == -1 ))
{
NXRunAlertPanel(
"Directory not writable",
"You do not have the proper write "
"permission for this directory.",
"OK", NULL, NULL );
return NO;
}
if( (fp = fopen( f, "w")) == NULL )
{
NXRunAlertPanel(
"File not writable",
"You do not have the proper write "
"permission for this file.", "OK", NULL, NULL );
return NO;
}
for( i = 0; ; i++ )
{
fooObject = [fooObjects objectAt: i];
if( fooObject == nil)
break;
startFrame = *[fooObject startFrame];
endFrame = *[fooObject endFrame];
comment = [fooObject comment];
fprintf(fp, "%x:%x:%x:%x %x:%x:%x:%x %s\n",
startFrame.hh, startFrame.mm,
startFrame.ss, startFrame.ff,
endFrame.hh, endFrame.mm,
endFrame.ss, endFrame.ff,
comment);
}
fclose(fp);
[cellScrollView loadCellsFrom:fooObjects];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.