This is eTAudio.m in view mode; [Download] [Up]
///////////////////////////////////////////////////////////////////////////////
// FILENAME: eTAudio.m
// SUMMARY: Implementation of Audio annotations to eText documents
// SUPERCLASS: eTAudio:eTImage:Object
// INTERFACE: None
// PROTOCOLS: <DocNotification, Annotation, Tool, ASCIISupport, HTMDSupport,
// LaTeXSupport, eTAudioNotification, InspectableTarget>
// AUTHOR: Rohit Khare
// COPYRIGHT: (c) 1994 California Institure of Technology, eText Project
///////////////////////////////////////////////////////////////////////////////
// IMPLEMENTATION COMMENTS
// There is a delicate ballet of timings, displays, and messages betwixt
// self, inspector panel, sound view, sound meter, sound, and delegate
// messages all around.
///////////////////////////////////////////////////////////////////////////////
// HISTORY
// 10/30/94: Modified to support <InspectableTarget>
// 07/24/94: Rewritten for PR1 release/eTImage
// 07/07/94: Rewritten as a subclass of ImageAnnotation
// 06/18/94: HTMDSupport. RK & TRZ.
// 01/24/94: Created. Derived largely from Version3's temporary Hypertext
// '93 hack. Renamed as eTAudio and eTAudioUI.
///////////////////////////////////////////////////////////////////////////////
#import "eTAudio.h"
#define _eTAudioVERSION 10
@implementation eTAudio
// id etAudioComponent;
/////////////////////////
- sound {return [etAudioComponent theSound];}
- (BOOL)isAudioMutable{return [etAudioComponent isMutable];}
- (BOOL)isAudioLinked{return [etAudioComponent isLinked];}
- (const char*)audioName {return [etAudioComponent componentName];}
- setAudioName:(const char*) newName
{return [etAudioComponent setComponentName:NXUniqueString(newName)];}
- setAudioDelegate:(id <eTAudioNotification>) newDelegate
{audioDelegate = newDelegate; return self;}
- audioDelegate {return audioDelegate;}
/////////////////////////
- audioStarted
{[audioDelegate audioStarted]; return [self setState:YES];}
- audioPaused // it would be cool to "dim" the speaking icon...
{[audioDelegate audioPaused]; return self;}
- audioResumed // and this would be the inverse brighten...
{[audioDelegate audioResumed]; return self;}
- audioEnded
{[audioDelegate audioEnded]; return [self setState:NO];}
/////////////////////////
+ toolAwake:theApp
{
[theApp registerAnnotation: [eTAudio class]
name: "eTAudio"
RTFDirective: "eTAudio"
menuLabel: "Insert Audio..."
menuKey: 'A'
menuIcon: (NXImage *) nil];
[theApp registerType:NXSoundPboardType for:[eTAudio class]];
[theApp registerType:NXCreateFilenamePboardType("snd") for:[eTAudio class]];
[theApp registerType:NXCreateFilenamePboardType("au") for:[eTAudio class]];
[theApp registerType:NXCreateFileContentsPboardType("snd") for:[eTAudio class]];
[theApp registerType:NXCreateFileContentsPboardType("au") for:[eTAudio class]];
return self;
}
- init
{
[super init];
[self setImageComponent:
[eTImageComponent newImageNamed:"eTAudioComponentIcon"]];
[self setAltImageComponent:
[eTImageComponent newImageNamed:"eTAudioComponentIconH"]];
[self setUsesButtonStyle:NO];
[self setDraggable:YES];
etAudioComponent=nil;
return self;
}
- free
{
etAudioComponent = [etAudioComponent free];
return self = [super free];
}
//////////////////////////////
- initFromPboard:thePB inDoc:theDoc linked:(BOOL) linked
{
[self init];
// we prevent super from executing initFromPboard, so we have to:
etDoc = theDoc;
theText = [[etDoc docUI] eTextObj]; // consistency checking
[etDoc registerNotification:self];
if (!thePB) {
etAudioComponent = [[eTAudioComponent alloc] initInDoc:theDoc linked:NO];
return self;
}
etAudioComponent=[[eTAudioComponent alloc] initInDoc:theDoc linked:linked];
[etAudioComponent readComponentFromPboard:thePB];
return self;
}
#define eTAUDIO "eTAudioComponentIcon"
#define eTAUDIO_GIF eTAUDIO".gif"
- writeComponentToPath:(NXAtom)path inFormat:(int) theFormat
{
const char *name;
if(!etDoc) NXLogError("etDoc is nil at %s %u",__FILE__,__LINE__);
name = [[imageComponent theImage] name];
if ((theFormat == HTMD_FMT) &&
name && !strcmp(name,eTAUDIO)) {
char cmd[2*MAXPATHLEN];
sprintf(cmd,"%s/"eTAUDIO_GIF, [[NXBundle mainBundle] directory]);
if (!access(cmd, F_OK|R_OK)) {
sprintf(cmd,"cp -rp \"%s/"eTAUDIO_GIF"\" \"%s/"eTAUDIO_GIF"\"", [[NXBundle mainBundle] directory], path);
system(cmd);
[etDoc registerComponent:eTAUDIO_GIF];
} else {
[super writeComponentToPath:path inFormat:theFormat];
}
} else
[super writeComponentToPath:path inFormat:theFormat];
[etAudioComponent writeComponentToPath:path inFormat:theFormat];
return self;
}
- addToPboard:pboard
{
[etAudioComponent addToPboard:pboard];
return self;
}
- readRichText:(NXStream *)stream forView:view
{
int i;
NXScanf(stream, "%d ", &i);
if (i != _eTAudioVERSION) {
// bad version block.
NXLogError("eTAudio found unparseable version %d at position %d",
i, NXTell(stream));
return nil;
}
[super readRichText:stream forView:view];
NXGetc(stream); // separating space
etAudioComponent = [[[eTAudioComponent alloc] initInDoc:etDoc linked:NO] readRichText:stream forView:view];
return self;
}
- writeRichText:(NXStream *)stream forView:view
{
NXPrintf(stream, "%d ", _eTAudioVERSION);
[super writeRichText:stream forView:view];
NXPutc(stream, ' '); // separate the two visually
[etAudioComponent writeRichText:stream forView:view];
return self;
}
- writeASCIIRef:(NXStream *)stream forView:view
{
NXPrintf(stream, "The audio annotation %y (last known address:%s)\n\t", [etAudioComponent componentName], [etAudioComponent currentPath]);
[super writeASCIIRef:stream forView:view];
return self;
}
- writeLaTeX:(NXStream*)stream forView:view
{
[super writeLaTeX:stream forView:view];
[etAudioComponent writeLaTeX:stream forView:view];
return self;
}
- writeHTML:(NXStream *)stream forView:view
{
[etAudioComponent writeHTML:stream forView:view andClose:NO];
[super writeHTML:stream forView:view];
NXPrintf(stream,"</A>");
return self;
}
//////////////////////////////
// the "delegate" calls below explicitly assume that inspect is called
// _before_ click or double-click. (this is indeed done by eTImage).
// (it is safe though -- nothing will happen)
- click:(NXEvent*)e
{return [[eTAudioUI new] click:self];}
- doubleClick:(NXEvent*)e
{return [[eTAudioUI new] doubleClick:self];}
- inspect:(NXEvent *) e
{return [[NXApp inspector] inspect:self];}
- (id <Inspectable>) inspectableDelegate {
return [[eTAudioUI new] setAnnotation:self]; }
- drag: (Pasteboard *)draggingPboard image:(NXImage **)proxyImage
{
if (! etAudioComponent) {
*proxyImage = nil;
return nil;
}
[etAudioComponent writeComponentToPboard:draggingPboard];
*proxyImage = [etAudioComponent icon];
return self;
}
//////////////////////////////
- setImageComponent:newImageComponent
{
const char *name;
name = [[newImageComponent theImage] name];
if (name && !strcmp(name,"eTAudioComponentIcon"))
usesButtonStyle = NO;
else
usesButtonStyle = YES;
return [super setImageComponent:newImageComponent];
}
@endThese are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.