This is MMGraphicCell.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
*
*
* MMGraphicCell.[hm]
* Cell used by the multi media text object to implement multimedia text
*
* Notes:
* 1) This object generates embeded RTF similar to Edit. This
* format is different from the rtf format used by mail.
* Mail does not put the height and width operators in the stream
*
* Text objects expect the embeded graphic objects to implement
* highlight:inView:lit: - not implemented
* drawSelf:inView:
* trackMouse:inRect:ofView: - not implemented
* calcCellSize:
* readRichText:forView:
* writeRichText:forView:
*
*/
/* Generated by Interface Builder */
#import "MMGraphicCell.h"
#import "MMText.h" /* for the filename method */
#import <libc.h> /* MAXPATHLEN */
#import <stdio.h>
#import <strings.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 <objc/List.h> /* list object */
#import <streams/streams.h>
@implementation MMGraphicCell:MMCell
static int imageCount = 0 ;
static char rcsstring[] =
"@(#)Object:MMGraphicCell.m Developer:Joe Freeman Version:2 July, 1991";
- initFromFile: (const char *)filename copy:(BOOL)flag
{
char *extent;
self = [super initFromFile: filename copy:flag];
theImage = [NXImage findImageNamed: filename];
if (!theImage){
theImage = [[NXImage alloc] initFromFile: filename];
[theImage setName:filename];
}
if ( filename &&
(strlen(filename)>5) &&
(extent = rindex(filename,'.'))){
if (!strcmp(extent,".eps")){
sprintf(saveName,"EPS%d.eps", imageCount++);
} else if (!strcmp(extent,".ps")){
sprintf(saveName,"PS%d.ps", imageCount++);
} else if (!strcmp(extent,".tiff") || !strcmp(extent,".tif")){
sprintf(saveName,"TIFF%d.tiff", imageCount++);
} else {
sprintf(saveName,"FREEMAN%d.tmp",imageCount++);
}
}
return self;
}
- initFromFile: (const char *)filename requestedByView: aView
{
[self initFromFile:filename copy:[aView copyGraphics]];
return self;
}
- initFromStream:(NXStream *)aStream copy:(BOOL)flag
{
self = [super init];
copyFlag = flag;
/* there is a note in the NXImage man page that hints that stream reads
* may be handled differently, using the default setting of dataRetained no
* this is a problem because the image will be converted to cached
*/
theImage = [[NXImage alloc] init];
[theImage setDataRetained:YES];
[theImage loadFromStream: aStream];
if ([[theImage lastRepresentation] class] == [NXBitmapImageRep class]){
sprintf(saveName,"TIFF%d.tiff", imageCount++);
} else
if ([[theImage lastRepresentation] class] == [NXEPSImageRep class]){
sprintf(saveName,"EPS%d.eps", imageCount++);
}
[theImage setName:saveName]; /* kludge, we don't have a file name */
return self;
}
/* figure out the best representation to save
* could look at the file name and figure out but we will be stupid
* scan list of representations looking for NXEPSImageRep and NXBitmapImageRep
* use EPS image rep if we find it, then bitmap if we cannot find it
* write nothing if neither (should be cached)
*
*/
- writeImageToStream: (NXStream *)stream
{
int i;
id epsRep=NULL;
id tiffRep = NULL;
char *epsString;
int epsLength;
List *repList = [theImage representationList];
if (repList && [repList count]){
for ( i = 0 ; i < [repList count] ; i++){
if ([[repList objectAt:i] class] == [NXBitmapImageRep class])
tiffRep = [repList objectAt:i];
else if ([[repList objectAt:i] class] == [NXEPSImageRep class])
epsRep = [repList objectAt:i];
}
}
if (epsRep){
[epsRep getEPS:&epsString length:&epsLength];
NXWrite(stream, epsString, epsLength);
} else if (tiffRep){
[tiffRep writeTIFF:stream usingCompression:NX_TIFF_COMPRESSION_NONE];
}
return self;
}
/* when copying, just write out a pointer to the graphic that this came from
* write out the necessary coding to embed graphic in rtf file
* when saving have eps/tiffimage written out to file in the rtfd directory
*/
- writeRichText:(NXStream *)stream forView:view
{
NXSize imageSize;
NXStream *aStream; /* to write image out to a file */
char fileName[MAXPATHLEN+1]; /* file name to save to */
[theImage getSize:&imageSize];
if (!copyFlag){
NXPrintf(stream, "%s \\width%d \\height%d\n",
[theImage name],(int)imageSize.width,(int)imageSize.height);
} else {
NXPrintf(stream, "%s \\width%d \\height%d",
saveName,(int)imageSize.width,(int)imageSize.height);
sprintf(fileName,"%s/%s",[view filename], saveName);
aStream = NXOpenMemory(NULL,0, NX_WRITEONLY);
[self writeImageToStream:aStream];
NXSaveToFile(aStream, fileName);
NXCloseMemory(aStream, NX_FREEBUFFER);
/* BUG
* this updates the name for any images that have save name == name
* this would normally happen if we did a paste from the pasteboard
* thus, for the duration of this session, all rtf pastes retain their
* original names.
*/
if (!strcmp([theImage name], saveName))
[theImage setName:fileName];
}
return self;
}
- readPrivate:(NXStream *)stream name:(char *)name
{
int width,height;
NXScanf(stream, "%s \\width%d \\height%d\n", name,&width,&height);
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.