This is AcceptDragText.m in view mode; [Download] [Up]
// AcceptDragText.m
// By Charles G. Fleming, Educational Computing Services, Allegheny College.
// Copyright 1993, Allegheny College.
// You may freely copy, distribute and reuse this code.
// Allegheny College and the author disclaim any warranty of any kind,
// expressed or implied, as to its fitness for any particular use.
#import "AcceptDragText.h"
#import "Borders.h"
#import "SaverAndRetriever.h"
@implementation AcceptDragText
- initFrame:(const NXRect *)frameRect text:(const char *)theText
alignment:(int)mode
{
int numTypes = 1;
const char *pasteboardTypes[2] = {NXFilenamePboardType, NULL};
[super initFrame:frameRect text:theText alignment:mode];
// Register the dragging types that this view will accept.
[self registerForDraggedTypes:pasteboardTypes count:numTypes];
// Get a pasteboard for dragging.
dragPasteboard = [Pasteboard newName:NXDragPboard];
// Create a file retriever to load dragged data files.
dataFileRetriever = [[FileRetriever allocFromZone:[self zone]] init];
[dataFileRetriever setDataDelegate:self];
return self;
}
- setOutputWindow:anObject
{
outputWindow = anObject;
return self;
}
-setInspectorPanel:anObject
{
inspectorPanel = anObject;
return self;
}
//*****************************************************************************
//*****************************************************************************
// NXDraggingDestination routines.
// Note that views and windows do not have to implement all of these methods
// since the View and Window classes provide private implemenations for all of
// these methods.
//*****************************************************************************
//*****************************************************************************
// The dragged image has entered the view.
- (NXDragOperation)draggingEntered:sender
{
NXDragOperation sourceMask;
NXPoint corner = {21, 57};
NXRect borderRect;
// Draw a blace border around the text when a file is dragged into it.
// Set up the NXImage that will display a black border when a file is
// dragged into the input text.
[[superview superview] getContentSize:&borderRect.size];
if(blackBorderNXImage)
[blackBorderNXImage free];
blackBorderNXImage = [[NXImage allocFromZone:[self zone]]
initSize:&borderRect.size];
[blackBorderNXImage lockFocus];
drawBlackBorder(borderRect.size.width, borderRect.size.height,
borderRect.size.width-2, borderRect.size.height-1);
[blackBorderNXImage unlockFocus];
// Draw the border.
[[window contentView] lockFocus];
[blackBorderNXImage composite:NX_SOVER toPoint:&corner];
[[window contentView] unlockFocus];
[window flushWindow];
// Ask the drag source for its operation mask.
sourceMask = [sender draggingSourceOperationMask];
if (sourceMask & NX_DragOperationCopy)
dragOperation = NX_DragOperationCopy;
else
dragOperation = NX_DragOperationNone;
return dragOperation;
}
// While the dragged image remains in the view, we receive this message.
- (NXDragOperation)draggingUpdated:sender
{
return dragOperation;
}
// If the dragged image leaves the view, we receive this message.
- draggingExited:sender
{
// Remove the black border being displayed.
[[self superview] display];
return self;
}
// When the dragged image is released, this message is sent. If we return
// YES, we will receive the performDragOperation: message.
- (BOOL)prepareForDragOperation:sender
{
// Remove the black border being displayed.
[[self superview] display];
// We do want to accept the dragged image and receive the
// performDragOperation message.
return YES;
}
// Do your work here.
- (BOOL)performDragOperation:sender
{
BOOL viewAcceptedData = NO, directoryFound = NO;
int dataLength;
char *filePath;
char *tab, *startPath, *remainingPaths, *lastSlash;
// Get the filename from the pasteboard.
if([dragPasteboard readType:NXFilenamePboardType data:&filePath
length:&dataLength])
{
[self setText:""];
startPath = filePath;
// Count the files.
tab = filePath;
for(; tab = index(tab, '\t'); tab++)
{
remainingPaths = tab+1;
*tab = '\0';
if(lastSlash = rindex(startPath, '/'))
{
strcpy(filename, lastSlash+1);
*lastSlash = '\0';
strcpy(directory, startPath);
startPath = remainingPaths;
}
[(FileRetriever *)dataFileRetriever setDirectory:directory];
[(FileRetriever *)dataFileRetriever setFilename:filename];
[dataFileRetriever open];
}
if(lastSlash = rindex(startPath, '/'))
{
strcpy(filename, lastSlash+1);
*lastSlash = '\0';
strcpy(directory, startPath);
startPath = remainingPaths;
}
[(FileRetriever *)dataFileRetriever setDirectory:directory];
[(FileRetriever *)dataFileRetriever setFilename:filename];
[dataFileRetriever open];
viewAcceptedData = YES;
}
return viewAcceptedData;
}
// Any necessary cleaning can be done here. This is the last message
// we will be sent.
- concludeDragOperation:sender
{
// The application will not be active if files were dragged into the
// input text from the Workspace.
if(![NXApp isActive])
{
[NXApp activateSelf:YES];
if(inspectorPanel)
if([inspectorPanel isVisible])
[inspectorPanel orderFront:self];
[outputWindow orderFront:self];
[window makeKeyAndOrderFront:self];
}
return self;
}
// We allow multiple data files to be dragged into the input text.
- (BOOL)readDataFromStream:(NXStream *)stream
{
char *buffer, *dataString;
int length, maxLength;
NXGetMemoryBuffer(stream, &buffer, &length, &maxLength);
dataString = (char *)malloc(length+1);
strncpy(dataString, buffer, length);
*(dataString+length) = '\0';
[self setSel:textLength :textLength];
[self replaceSel:dataString];
[self sizeToFit];
free(dataString);
return YES;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.