This is IconWellControl.m in view mode; [Download] [Up]
// IconWellControl.m
//
// Free software created 1 Feb 1992
// by Paul Burchard <burchard@math.utah.edu>.
#import "IconWellControl.h"
#import "IconWell.h"
#import "DragDrop.h"
#import <appkit/appkit.h>
#import <objc/Storage.h>
#import <objc/HashTable.h>
const char *newIconName = "IconWellControl-tmp";
const char *blankIconName = "Blank";
@implementation IconWellControl
static id wellSpeaker;
static id convertWindowToControl;
+ initialize
{
if(self == [IconWellControl class])
{
wellSpeaker = [[Speaker alloc] init];
convertWindowToControl =
[[HashTable alloc] initKeyDesc:"@" valueDesc:"@"];
}
return self;
}
+ controlFor:theWindow
{
return (id)[convertWindowToControl valueForKey:(void *)theWindow];
}
- listen:sender
{
// Tell WorkSpace we want icon-dragging.
if(isListening) return self;
if(!window) return nil;
NXConvertWinNumToGlobal([window windowNum], &globalWindowNum);
if(![wellSpeaker setSendPort:NXPortFromName(NX_WORKSPACEREQUEST, NULL)])
return nil;
if(0 != [wellSpeaker registerWindow:globalWindowNum
toPort:[wellListener listenPort]])
return nil;
[wellListener setDelegate:self];
isListening = YES;
return self;
}
- initWindow:theWindow
{
char portName[1024];
[super init];
window = theWindow;
wellListener = [[Listener alloc] init];
sprintf(portName, "IconWellControlPort-%ld", (long)[self self]);
if(0 != [wellListener checkInAs:portName]) return nil;
[wellListener addPort];
newIconPath = [[Storage alloc] initCount:0 elementSize:sizeof(char) description:"c"];
[convertWindowToControl insertKey:(void *)theWindow value:(void *)self];
[self listen:self];
return self;
}
- free
{
if(window) [convertWindowToControl removeKey:(void *)window];
[wellListener free];
[newIconPath free];
[newIconImage free];
return [super free];
}
- (const char *)newIconPath
{
return (const char *)[newIconPath elementAt:0];
}
- (int)iconEntered:(int)windowNum at:(double)x :(double)y
iconWindow:(int)iconWindowNum iconX:(double)iconX iconY:(double)iconY
iconWidth:(double)iconWidth iconHeight:(double)iconHeight
pathList:(char *)pathList
{
int i, n;
id list;
NXSize size;
// Create temp NXImage to hold dragged icon.
// NOTE: newIconImage is only freed beforehand if it still has temp name
// (i.e. was not used last drag).
if(!pathList) return 0;
size.width = size.height = 48.0;
[[NXImage findImageNamed:newIconName] free];
newIconImage = [[NXImage alloc] initSize:&size];
[newIconImage lockFocus];
copyIconPicture(iconWindowNum,
(float) iconX, (float) iconY, (float) iconWidth, (float) iconHeight);
[newIconImage unlockFocus];
[newIconImage setName:newIconName];
// Temporarily stash new path.
[newIconPath setNumSlots:(strlen(pathList)+1)];
strcpy((char *)[newIconPath elementAt:0], pathList);
// Accept message, and forward to all IconWells in this Window.
list = [IconWell wellListFor:window];
n = [list count];
for(i=0; i<n; i++)
[[list objectAt:i] iconEntered:windowNum at:x :y
iconWindow:iconWindowNum iconX:iconX iconY:iconY
iconWidth:iconWidth iconHeight:iconHeight
pathList:pathList];
return 0;
}
- (int)iconMovedTo:(double)x :(double)y
{
int i, n;
id list;
// Accept message, and forward to all IconWells in this Window.
list = [IconWell wellListFor:window];
n = [list count];
for(i=0; i<n; i++)
[[list objectAt:i] iconMovedTo:x :y];
return 0;
}
- (int)iconExitedAt:(double)x :(double)y
{
int i, n;
id list;
// Accept message, and forward to all IconWells in this Window.
list = [IconWell wellListFor:window];
n = [list count];
for(i=0; i<n; i++)
[[list objectAt:i] iconExitedAt:x :y];
// Get rid of temp icon and path.
[[NXImage findImageNamed:newIconName] free];
newIconImage = nil;
[newIconPath setNumSlots:0];
return 0;
}
- (int)iconReleasedAt:(double)x :(double)y ok:(int *)flag
{
int i, n, accepted;
id list;
// Accept message, and forward to all IconWells in this Window.
list = [IconWell wellListFor:window];
n = [list count];
for(i=0, *flag=0, accepted=0; i<n; i++, accepted=0)
{
[[list objectAt:i] iconReleasedAt:x :y ok:&accepted];
if(accepted != 0) *flag = 1;
}
// Get rid of temp path.
// Temp icon image is only freed if it was not accepted.
[newIconPath setNumSlots:0];
if(*flag == 0)
{
[[NXImage findImageNamed:newIconName] free];
newIconImage = nil;
}
return 0;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.