This is DragView.m in view mode; [Download] [Up]
#import "DragView.h"
#import "Controller.h"
#import <appkit/appkit.h>
@implementation DragView
/*-------------------- methods to get things set up */
- initFrame:(const NXRect *)theFrame
{
const char *const types[] = {NXPostScriptPboardType};
[super initFrame:theFrame];
//register which pasteboard types you will accept
[self registerForDraggedTypes:(const char *const*)&types count:1];
drawBackground = YES;
return self;
}
- awakeFromNib
{
framed = NO;
return self;
}
/*-------------------- methods to be the source of a dragging operation */
- mouseDown:(NXEvent *)theEvent
{
NXPoint zero = {0.0, 0.0};
NXPoint hitPoint;
id thePboard;
hitPoint = theEvent->location;
[self convertPoint:&hitPoint fromView:nil];
// Prevent default window ordering (this is a new appkit feature)
[NXApp preventWindowOrdering];
//get the Pboard
thePboard = [Pasteboard newName:NXDragPboard];
[thePboard declareTypes:&NXPostScriptPboardType num:1 owner:self];
//put an EPS of the image on the Pboard
drawBackground = NO;
[self writePSCodeInside:&hotRect to:thePboard];
drawBackground = YES;
//start the drag
[self dragImage:epsIcon // visable on screen during drag
at:& hotRect.origin // offset the mouse point for the drag
offset:&zero // offset the inital mouse pt
event:theEvent // theEvent structure
pasteboard:thePboard // a Pasteboard with data on it
source:self // source object
slideBack:YES]; // if no destination animate back to source
return self;
}
- draggedImage:(NXImage *)image beganAt:(NXPoint *)screenPoint
{
return self;
}
- (NXDragOperation)draggingSourceOperationMaskForLocal:(BOOL)flag
{
return (NX_DragOperationCopy | NX_DragOperationGeneric);
}
/*-------------------- methods to display, and other useful stuff */
- (BOOL)acceptsFirstMouse
{
return YES;
}
- (BOOL)acceptsFirstResponder
{
return YES;
}
- (BOOL)shouldDelayWindowOrderingForEvent:(NXEvent *)theEvent
{
// This is the other portion of the new appkit functionality
// which allows you to drag a partially obscure object without
// making the source window become main, and without making the
// source application the current app.
return YES;
}
- setImage:(id)anImage
{
// free epsIcon it if is been used
if(epsIcon) [epsIcon free];
framed = NO;
epsIcon = anImage;
[epsIcon getSize:&(hotRect.size)];
hotRect.origin.x = floor((NX_WIDTH(&bounds) - NX_WIDTH(&hotRect)) / 2.0);
hotRect.origin.y = floor((NX_HEIGHT(&bounds) - NX_HEIGHT(&hotRect)) / 2.0);
[self display];
return self;
}
- drawSelf:(const NXRect *)rects :(int)num
{
// if we are copying the PS code onto the Pboard, then we don't want
// the white background. Only the image.
if (drawBackground) NXEraseRect(rects);
// Composite the image into the view.
[epsIcon composite:NX_SOVER toPoint:&hotRect.origin];
// if we are in the middle of a drag operation then we can frame the
// view rect to show our acceptance of the incomming data. Another way
// would be to create a ghost image similar to the shelf in Workspace.
if(framed) {
NXFrameRectWithWidth(&bounds, (NXCoord)3.0);
}
return self;
}
- copy:sender
{
id pBoard = [Pasteboard new];
[pBoard declareTypes:&NXPostScriptPboardType num:1 owner:self];
[self writePSCodeInside:&hotRect to:pBoard];
return self;
}
- free
{
// be a good object and free things up
[epsIcon free];
return [super free];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.