This is DragView.m in view mode; [Download] [Up]
//====================================================================== // // Portions written by FreemanSoft Inc. // // FreemanSoft disclaims any warranty of any kind, expressed or implied, // as to this source code's fitness for any particular use. // // For more information, use the following electronic mail addresses: // // info@FreemanSoft.com general questions // support@FreemanSoft.com technical questions // //====================================================================== /* Written by * Joe Freeman jfreeman@next.com * DragView * * This code has no warranty. * It is provided so that the consumer may maintain and modify it * at their own risk. Use this code at your own risk. */ #import "DragView.h" #import <appkit/appkit.h> #define bozo_alert "Bozo Alert" #define make_mind_up "Can you please decide what folder you want to drag in?" #define OK "OK" @implementation DragView - setDelegate:anObject { delegate = anObject; [self registerForDraggedTypes:&NXFilenamePboardType count:1 ]; return self; } /*======================================================================== * notifies workspace to slide browser to that points *========================================================================*/ - mouseDown:(NXEvent *)theEvent { NXEvent localCopy = *theEvent; [self convertPoint: &localCopy.location fromView:nil]; if (delegate && [delegate respondsTo:@selector(userClicked:at:inDragView:)]) [delegate userClicked:localCopy.data.mouse.click at:&localCopy.location inDragView:self]; return self; } /*======================================================================== * *========================================================================*/ - (NXDragOperation)draggingEntered:(id <NXDraggingInfo>)sender { /* we only support generic kinds of drags (no links or copies) */ if (delegate && [delegate respondsTo:@selector(iconEntered:)] && [delegate respondsTo:@selector(iconBogus:)] ) { [self proposedImage:[sender draggedImage]]; if ( [delegate isFilePBValid:[sender draggingPasteboard] forView:self]) { [delegate iconEntered:self]; } else { [delegate iconBogus:self]; } return NX_DragOperationGeneric; } else { return NX_DragOperationNone; } } - draggingExited:(id <NXDraggingInfo>)sender { if (delegate && [delegate respondsTo:@selector(iconLeft:)]) { [self abortProposedImage:self]; [delegate iconLeft:self]; if (++exit_count > 6){ NXRunAlertPanel("Bozo Alert", make_mind_up, OK,NULL,NULL); exit_count = 0; } return self; } else return nil; } /* after the icon is let go but while still on the screen * return yes to accept , no to not accept */ - (BOOL)prepareForDragOperation:(id <NXDraggingInfo>)sender { Pasteboard *filePB; BOOL retFlag = NO; exit_count = 0; filePB = [sender draggingPasteboard]; if ( delegate && [delegate acceptedFilePB:[sender draggingPasteboard] forView:self]) { [self currentImage:[sender draggedImageCopy]]; [delegate iconDropped:self]; retFlag = YES; } else { [self abortProposedImage:self]; retFlag = NO; } if (delegate && [delegate respondsTo:@selector(iconDropped:)]) [delegate iconDropped:self]; return retFlag; } /* * last message received * * through experimentation I determined * we only get here if we returned YES in prepareForDragOperaton */ - (BOOL)performDragOperation:(id <NXDraggingInfo>)sender { return YES; } /*======================================================================== * so someone can programaticly tell to grab an icon for a specific file *========================================================================*/ - useIconForFile:(char *)aFullFilePath { NXImage *imageForFile; imageForFile = [[Application workspace] getIconForFile:aFullFilePath]; if (imageForFile) { [self currentImage:imageForFile]; return self; } else { /* should never get this. workspace returns unknown icon */ [self currentImage: [[NXImage alloc] initFromSection:"JumpBack_help"]]; return nil; } } /*======================================================================== * * dual icon handling code * *========================================================================*/ - proposedImage:theImage { if (theImage != proposedImage) { proposedImage = theImage; [self display]; } return self; } - currentImage:theImage { proposedImage = nil; if (currentImage != theImage) { [currentImage free]; currentImage = theImage; [self display]; } return self; } - (NXImage *)currentImage { return currentImage; } - abortProposedImage:sender { return [self proposedImage:nil]; } - acceptProposedImage:sender { return [self currentImage: proposedImage]; } - clearCurrentImage:sender { return [self currentImage: nil]; } - drawSelf:(const NXRect *)r :(int)c { NXPoint iconOrigin; NXSize iconSize; NXDrawGrayBezel(&bounds, &bounds); /* * proposed is checked first in case we * have current but are proposing new */ if (proposedImage){ [proposedImage getSize:&iconSize]; iconOrigin.x= (bounds.size.width-iconSize.width)/2.0; iconOrigin.y= (bounds.size.height-iconSize.height)/2.0; [proposedImage composite:NX_SOVER toPoint: (const NXPoint *)&iconOrigin]; /* really ugly */ PSsetalpha(.5); PScompositerect( iconOrigin.x, iconOrigin.y, iconSize.width, iconSize.height, NX_SOVER); } else if (currentImage){ [currentImage getSize:&iconSize]; iconOrigin.x= (bounds.size.width-iconSize.width)/2.0; iconOrigin.y= (bounds.size.height-iconSize.height)/2.0; [currentImage composite:NX_SOVER toPoint: (const NXPoint *)&iconOrigin]; } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.