This is AcceptDragScrollView.m in view mode; [Download] [Up]
// AcceptDragScrollView.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 "AcceptDragScrollView.h"
#import "ToolLoader.h"
#import "Borders.h"
@implementation AcceptDragScrollView
- initFrame:(const NXRect *)frameRect
{
int numTypes = 1;
const char *pasteboardTypes[2] = {NXFilenamePboardType, NULL};
NXRect borderRect = {0, 0, 646, 57};
self = [super initFrame:frameRect];
// Register the dragging types that this view will accept.
[self registerForDraggedTypes:pasteboardTypes count:numTypes];
// Get a pasteboard for dragging.
dragPasteboard = [Pasteboard newName:NXDragPboard];
return self;
}
- setToolLoader:anObject
{
toolLoader = 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;
NXRect borderRect;
NXPoint corner = {0, 18};
// Set up the NXImage that will display a white border when a tool is
// dragged into the tool scroll view.
[self 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-3, borderRect.size.height-1);
[blackBorderNXImage unlockFocus];
// Draw a black border around the scroll view when the dragged image
// enters.
[superview convertPoint:&corner toView:[window contentView]];
[[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 white border being displayed.
[self 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 white border being displayed.
[self 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;
int index, count, toolCount = 0, nextFile;
char *tab, *startPath, *remainingPaths, *extension, *lastSlash;
char tempPath[MAXPATHLEN+1], directory[MAXPATHLEN+1];
char **paths, **files;
// Get the filename from the pasteboard.
if([dragPasteboard readType:NXFilenamePboardType data:&filePath
length:&dataLength])
{
// Count the files.
tab = filePath;
for(count = 1; tab = index(tab, '\t'); tab++, count++);
// Make a copy of each file.
paths = (char **)malloc(sizeof(char *) * count);
count = 0;
startPath = filePath;
while(tab = index(startPath, '\t'))
{
remainingPaths = tab+1;
*tab = '\0';
*(paths+count) = (char *)malloc(strlen(startPath)+1);
strcpy(*(paths+count), startPath);
startPath = remainingPaths;
count++;
}
*(paths+count) = (char *)malloc(strlen(startPath)+1);
strcpy(*(paths+count), startPath);
count++;
// Use the null string for files without the .wbTool extension.
// Find the directory once.
for(index = 0; index < count; index++)
if(extension = rindex(*(paths+index), '.'))
if(strcmp(extension, ".wbTool"))
strcpy(*(paths+index), "");
else
if(lastSlash = rindex(*(paths+index), '/'))
{
*lastSlash = '\0';
if(!directoryFound)
{
strcpy(directory, *(paths+index));
directoryFound = YES;
}
strcpy(tempPath, lastSlash+1);
strcpy(*(paths+index), tempPath);
toolCount++;
}
else
strcpy(*(paths+index), "");
else
strcpy(*(paths+index), "");
// Keep only those files with the .wbTool extension.
if(toolCount)
{
files = (char **)malloc((1+toolCount) * sizeof(char *));
nextFile = 0;
for(index = 0; index < count; index++)
if(strcmp(*(paths+index), ""))
{
*(files+nextFile) = (char *) malloc(strlen(
*(paths+index))+1);
strcpy(*(files+nextFile), *(paths+index));
nextFile++;
}
*(files+nextFile) = NULL;
[toolLoader setToolDirectory:directory];
[toolLoader setToolFiles:files ];
[toolLoader loadTool];
// Free the tool paths.
for(index = 0; index < toolCount+1; index++)
free(*(files+index));
free(files);
}
// Free the file paths when done.
for(index = 0; index < count; index++)
free(*(paths+index));
free(paths);
// Deallocate the memory allocated by the readType:data:length: method.
[dragPasteboard deallocatePasteboardData:filePath length:dataLength];
viewAcceptedData = YES;
}
else
viewAcceptedData = NO;
return viewAcceptedData;
}
// Any necessary cleaning can be done here. This is the last message
// we will be sent.
- concludeDragOperation:sender
{
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.