This is SuperText.m in view mode; [Download] [Up]
/*
* SuperText
*
* SuperText is a subclass of the Text object that accepts files dragged
* in and displays them as icons. Double-clicking on the file icon will
* open the file in the Workspace. SuperText will perform properly when
* grouped in a ScrollView via IB's "group in ScrollView" function.
*
* You may freely copy, distribute and reuse the code in this example.
* This code is provided AS IS without warranty of any kind, expressed
* or implied, as to its fitness for any particular use.
*
* Copyright 1995 Ralph Zazula (rzazula@next.com). All Rights Reserved.
*
*/
#import "SuperText.h"
#import "FileImage.h"
#import <appkit/appkit.h>
BOOL IncludesType(const NXAtom *types, NXAtom type)
{
if (types) while (*types) if (*types++ == type) return YES;
return NO;
}
@implementation SuperText
- initFrame:(const NXRect *)frameRect
{
const char *fileType[] = {NXFilenamePboardType};
NXSize aSize = {1.0E38, 1.0E38};
//
// This should be done somewhere else. The preferred way is probably
// just to use RTFD format anyway...
//
[Text registerDirective:"FileImage" forClass:[FileImage class]];
[super initFrame:frameRect];
[self setMonoFont:NO];
[self setOpaque:YES];
[self notifyAncestorWhenFrameChanged:YES];
[self setVertResizable:YES];
[self setHorizResizable:NO];
[self setMinSize:&(frameRect->size)];
[self setMaxSize:&aSize];
[self setAutosizing:NX_HEIGHTSIZABLE | NX_WIDTHSIZABLE];
[self setSel:0 :0];
[self registerForDraggedTypes:fileType count:1];
return self;
}
- awakeFromNib
{
[self display];
return self;
}
//========================================================================
//
// methods that implement dropping
//
//========================================================================
- (BOOL)readDragData:(Pasteboard *)pboard
{
return YES;
}
- (NXDragOperation)draggingEntered:(id <NXDraggingInfo>)sender
{
NXDragOperation sourceMask;
sourceMask = [sender draggingSourceOperationMask];
if (sourceMask & NX_DragOperationLink)
return NX_DragOperationLink;
return NX_DragOperationNone;
}
- (BOOL)performDragOperation:(id <NXDraggingInfo>)sender
{
return YES;
}
- (BOOL)prepareForDragOperation:(id <NXDraggingInfo>)sender
{
return YES;
}
- concludeDragOperation:(id <NXDraggingInfo>)sender
{
int length;
Pasteboard *pboard;
char *data, *file, *tab;
id newGraphic;
pboard = [sender draggingPasteboard];
if (IncludesType([pboard types], NXFilenamePboardType)) {
[pboard readType:NXFilenamePboardType data:&data length:&length];
file = data;
while (file) {
if (tab = strchr(file, '\t')) *tab = '\0';
newGraphic = [[FileImage alloc]
initForImage:[[Application workspace] getIconForFile:file]
fileName:file];
/* check to see if we have a selection yet, if not, make one */
if (sp0.cp < 0) {
int textlength = [self textLength];
[self setSel:textlength :textlength];
}
[self replaceSelWithCell:newGraphic];
file = tab ? ++tab : NULL;
}
[pboard deallocatePasteboardData:data length:length];
[[self window] setDocEdited:YES];
}
return self;
}
- write:(NXTypedStream *)stream
{
NXStream *theStream;
int len;
int maxLen;
char *data;
// do the default write:
[super write:stream];
// now, write the RTFD stuff to a NXStream
theStream = NXOpenMemory(NULL,0,NX_READWRITE);
[self writeRTFDTo:theStream];
// now, get that data into a buffer
NXGetMemoryBuffer(theStream, &data, &len, &maxLen);
// and write it to the NXTypedStream that we were passed
NXWriteTypes(stream,"i",&len);
NXWriteArray(stream, "c", len, data);
NXClose(theStream);
return self;
}
- read:(NXTypedStream *)stream
{
NXStream *theStream;
char *data;
int count;
[super read:stream];
NXReadTypes(stream,"i",&count);
NX_MALLOC(data,char,count);
NXReadArray(stream,"c", count, data);
theStream = NXOpenMemory(NULL,0,NX_READWRITE);
NXWrite(theStream,data,count);
[self readRTFDFrom:theStream];
NXClose(theStream);
return self;
}
- (BOOL)respondsTo:(SEL)aSelector
{
// printf("in SuperText respondsTo:\n");
return [super respondsTo:aSelector];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.