This is MMCell.m in view mode; [Download] [Up]
/* written by Joe Freeman of NeXT Computer Inc.
* Version 2
* As with all my code, use at your own risk
*
*
* MMCell.[hm]
* Cell used by the multi media text object to implement file attachments
*
* Notes:
* 1) This object generates attachments similar to mail.
* The format is identical ... see note in MMText for
* incompatible explanations
*
* Text objects expect the embeded graphic objects to implement
* highlight:inView:lit:
* drawSelf:inView:
* trackMouse:inRect:ofView:
* calcCellSize:
* readRichText:forView:
* writeRichText:forView:
*
*/
#import "MMCell.h"
#import "MMText.h" /* for the filename method */
#import <libc.h> /* MAXPATHLEN */
#import <stdio.h>
#import <strings.h>
#import <appkit/Application.h>
#import <appkit/Listener.h>
#import <appkit/Speaker.h>
#import <appkit/NXImage.h>
#import <appkit/NXBitmapImageRep.h>
#import <appkit/NXEPSImageRep.h>
#import <appkit/tiff.h> /* NX_TIFF_COMPRESSION_NONE */
#import <dpsclient/dpsNeXT.h> /* NX_COPY */
#import <streams/streams.h>
@implementation MMCell:Cell
static char rcsstring[] =
"@(#)Object:MMCell.m Developer:Joe Freeman Version:2 July, 1991";
/* assume that we just want the image of the file and we save the pointer */
- initFromFile: (const char *)filename copy:(BOOL)flag
{
self = [super init];
copyFlag = flag;
return self;
}
- initFromFile: (const char *)filename requestedByView: aView
{
[self initFromFile:filename copy:NO];
return self;
}
- free
{
/* probably don't want to free cause could be used by other filecell */
//[theImage free];
[super free];
return self;
}
/*==================================================
*
*
*==================================================*/
- calcCellSize:(NXSize *)theSize
{
NXSize s;
[theImage getSize: &s];
s.height += 4.0;
s.width += 4.0;
*theSize = s;
return self;
}
- highlight:(const NXRect *)cellFrame inView:controlView lit:(BOOL)flag;
{
#ifdef DEBUG
fprintf(stderr,"MMCell.m highlight inView lit\n");
#endif DEBUG
return self;
}
/* this is really ugly and should sit on top of the built in cell tracking
* but that doesn't seem to be working
*/
- (BOOL)trackMouse:(NXEvent *)theEvent
inRect:(const NXRect *)cellFrame
ofView:controlView;
{
int aFlag;
static long lastDown; /* should initialize to 0 */
id speaker = [NXApp appSpeaker];
/* if the user clicks down in less than .33 secs (20 intervals)
* then lets treat it as a double click
*/
if (theEvent->time-lastDown < 20){
[speaker setSendPort:
NXPortFromName(NX_WORKSPACEREQUEST, NULL)];
[speaker openFile: [theImage name] ok:&aFlag];
}
lastDown = theEvent->time;
/* should allow drag out here */
return YES;
}
/*==================================================
*
*
*==================================================*/
- write:(NXTypedStream *)stream
{
[super write:stream];
NXWriteObject(stream , theImage);
NXWriteTypes(stream,"*i",&saveName,©Flag);
return self;
}
- read:(NXTypedStream *)stream
{
[super read:stream];
theImage = NXReadObject(stream);
NXReadTypes(stream,"*i",&saveName,©Flag);
return self;
}
/*
* just write out the name of the attached file
* good for links
*/
- writeRichText:(NXStream *)stream forView:view
{
char fileName[MAXPATHLEN+1]; /* file name to save to */
if (copyFlag) {
NXPrintf(stream,"%s\n",saveName);
sprintf(fileName,"cp %s %s/%s",
[theImage name], [view filename], saveName);
system(fileName);
} else {
NXPrintf(stream, "%s\n",[theImage name]);
}
return self;
}
- readPrivate:(NXStream *)stream name:(char *)name
{
NXScanf(stream, "%s\n", name);
return self;
}
/* read the attached file name out of the stream
* then go get the icon for the file
* GraphicCells do something different
*/
- readRichText:(NXStream *)stream forView:view
{
char name[MAXPATHLEN+1];
char fileName[MAXPATHLEN+1];
[self readPrivate:stream name:name];
if (!index(name,'/'))
sprintf(fileName,"%s/%s",[view filename],name);
else
strcpy(fileName,name);
[self initFromFile: fileName requestedByView: view ];
return self;
}
/*==================================================
*
*
*==================================================*/
- drawInside: (const NXRect *)cellFrame inView:controlView
{
NXPoint compositePlace;
#ifdef DEBUG
fprintf(stderr,"MMCell drawInside:inView:\n");
#endif DEBUG
compositePlace.x = cellFrame->origin.x+2.0;
compositePlace.y = NX_MAXY(cellFrame)+ 2.0;
[theImage composite:NX_COPY toPoint:&compositePlace];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.