This is FileShelfView.m in view mode; [Download] [Up]
#import "FileShelfView.h"
#import "TokenString.h"
@interface FileShelfView (Private)
- burstNames;
@end
@implementation FileShelfView
-initFrame:(const NXRect *)rect
{
[super initFrame: rect];
[self registerForDraggedTypes:&NXFilenamePboardType count:1];
images = [[List alloc] init];
fileNames = [[List alloc] init];
singleNames = [[List alloc] init];
nameListDirty = NO;
enabled = YES;
return self;
}
- free
{
[self unregisterDraggedTypes];
[images freeObjects];
[images free];
[fileNames freeObjects];
[fileNames free];
[singleNames freeObjects];
[singleNames free];
return [super free];
}
- empty
{
[images freeObjects];
[fileNames freeObjects];
[self display];
return self;
}
- drawSelf:(NXRect *)r :(int) count
{
int cnt, x;
NXPoint zeroPoint = {0.0, 0.0};
/* Erase the whole view */
if(enabled)
NXDrawGrayBezel(&bounds, &bounds); /* with bezel if enabled */
else
{
NXSetColor ([window backgroundColor]);
NXRectFill (&bounds);
}
zeroPoint.y = (bounds.size.height / 2) - 24;
for(x = 0, cnt = [images count]; x < cnt; x++)
{
zeroPoint.x = (x * 50) + 2;
[[images objectAt: x] composite: NX_SOVER toPoint: &zeroPoint];
}
return self;
}
- fileNames
{
if(nameListDirty)
[self burstNames];
return singleNames;
}
- setEnabled: (BOOL)flag
{
if(flag == enabled)
return self;
enabled = flag;
[self empty];
[self display];
return self;
}
- (BOOL) enabled
{
return enabled;
}
- addFile: (const char *)filename
{
id file = [[StringStorage alloc] init: filename];
NXImage *image;
image = [[Application workspace] getIconForFile: [file stringValue]];
if(!(image && enabled))
{
[file free];
return nil;
}
[images addObject: image];
[fileNames addObject: file];
[self display];
nameListDirty = YES;
return self;
}
- mouseDown: (NXEvent *)anEvent
{
NXEvent saveEvent;
NXPoint origin, offset;
Pasteboard *dragPasteboard;
int x;
saveEvent = *anEvent;
/* find the hit icon and its origin */
origin = anEvent->location;
[self convertPoint: &origin fromView: nil];
origin.y = (bounds.size.height / 2) - 24;
x = origin.x;
x -= 2;
origin.x = ((x / 50) * 50) + 2;
dragIndex = x / 50;
offset.x = offset.y = 0;
/* create and load pasteboard - then start drag */
dragPasteboard = [Pasteboard newName: NXDragPboard];
[dragPasteboard declareTypes: &NXFilenamePboardType num:1 owner:self];
[self dragImage: [images objectAt: dragIndex] at: &origin offset: &offset
event: &saveEvent pasteboard: dragPasteboard source: self slideBack: NO];
return [super mouseDown: anEvent];
}
@end
@implementation FileShelfView (NXDraggingDestinationProtocol)
- (NXDragOperation)draggingEntered:(id <NXDraggingInfo>)sender
{
NXLogError("draggingEntered\n");
if(enabled && ([sender draggingSourceOperationMask] & NX_DragOperationCopy))
return NX_DragOperationCopy;
else
return NX_DragOperationNone;
}
- draggingExited:sender
{
NXLogError("draggingExited\n");
return self;
}
- (BOOL)performDragOperation:(id <NXDraggingInfo>)sender
{
NXLogError("performDragOperation\n");
return ([self draggingEntered: sender] == NX_DragOperationNone) ? NO : YES;
}
- concludeDragOperation:(id <NXDraggingInfo>)sender
{
Pasteboard *pboard = [sender draggingPasteboard];
char *files;
int len;
id aFile;
NXLogError("concludeDragOperation\n");
[images addObject: [sender draggedImageCopy]];
[pboard readType:NXFilenamePboardType data: &files length: &len];
aFile = [[StringStorage alloc] init: files];
[fileNames addObject:aFile];
[self display];
nameListDirty = YES;
return self;
}
@end
@implementation FileShelfView (FSVNXDraggingSource)
- (NXDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal
{
return NX_DragOperationCopy;
}
- draggedImage:(NXImage *)image endedAt:(NXPoint *)screenPoint deposited:(BOOL)didDeposit
{
NXLogError("draggedImage:endedAt:deposited: %d", didDeposit);
if(!didDeposit)
{
[[images removeObjectAt: dragIndex] free];
[[fileNames removeObjectAt: dragIndex] free];
[self display];
nameListDirty = YES;
}
return self;
}
@end
@implementation FileShelfView (Private)
/* fileNames may contain multiple file entries - burst them */
- burstNames
{
int x, cnt;
id someNames = [[TokenString alloc] init];
id aFileName;
const char *fileNameStr;
[singleNames freeObjects]; /* free old version of the list */
[someNames setSeparator: '\t'];
for(x = 0, cnt = [fileNames count]; x < cnt; x++)
{
[someNames setStringValue: [[fileNames objectAt: x] stringValue]];
while(fileNameStr = [someNames popString])
{
aFileName = [[StringStorage alloc] init: fileNameStr];
[singleNames addObject: aFileName];
}
}
[someNames free];
nameListDirty = NO;
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.