This is IKIconPath.m in view mode; [Download] [Up]
#pragma .h #import <AppKit/NSMatrix.h>
#pragma .h #import "IKCell.h"
#import <AppKit/AppKit.h>
#import <InterfaceBuilder/InterfaceBuilder.h>
#import "iconkit.h"
@implementation IKIconPath:NSMatrix
{
IKCell *current;
IKCell *last;
BOOL draggingEntered;
}
- initWithFrame:(NSRect)frameRect
{
if ((self = [self initWithFrame:frameRect mode:NSRadioModeMatrix cellClass:[IKCell class] numberOfRows:1 numberOfColumns:1]) != nil) {
[self setCellSize:frameRect.size];
[self sizeToCells];
draggingEntered = NO;
}
return self;
}
- initWithFrame:(NSRect)frameRect mode:(int)aMode prototype:aCell numberOfRows:(int)rows numberOfColumns:(int)cols
{
if ((self = [self initWithFrame:frameRect mode:aMode cellClass:[IKCell class] numberOfRows:rows numberOfColumns:cols]) != nil) {
[self setPrototype:aCell];
draggingEntered = NO;
}
return self;
}
- initWithFrame:(NSRect)frameRect mode:(int)aMode cellClass:class numberOfRows:(int)rows numberOfColumns:(int)cols
{
NSSize zero = { 0, 0 };
if ((self = [super initWithFrame:frameRect mode:aMode cellClass:class numberOfRows:rows numberOfColumns:cols]) != nil) {
[self setBackgroundColor:[NSColor lightGrayColor]];
[self setCellSize:zero];
[self setIntercellSpacing:zero];
[self setAllowsEmptySelection:NO];
draggingEntered = NO;
}
return self;
}
- (void)doAwake
{
draggingEntered = NO;
[self setCellBackgroundColor:[NSColor lightGrayColor]];
}
- awakeAfterUsingCoder:(NSCoder *)aDecoder
{
[self doAwake];
return self;
}
- (void)mouseDown:(NSEvent *)event
{
NSPoint where = [event locationInWindow];
NSRect cellFrame;
int hit, row, col;
id aCell;
where = [self convertPoint:where fromView:nil];
[self getRow:&row column:&col forPoint:where];
aCell = [self cellAtRow:row column:col];
cellFrame = [self cellFrameAtRow:row column:col];
hit = [aCell hitPart:&where inRect:&cellFrame];
if ((hit == IK_ICONPART) && [aCell isDraggable] && !([event modifierFlags] & (NSShiftKeyMask | NSAlternateKeyMask))) {
if (aCell == [self selectedCell]) {
[[self window] makeFirstResponder:self];
} else {
[self endEditing];
}
[self selectCell:aCell];
current = last = nil;
[aCell dragIcon:event inRect:&cellFrame ofView:self];
if ([event clickCount] > 1) {
[self sendDoubleAction];
} else {
[self sendAction];
}
} else if ((hit == IK_TITLEPART) && [aCell isEditable] && [aCell state]) {
[aCell editTitle:event inRect:&cellFrame ofView:self];
} else {
if (aCell == [self selectedCell]) {
[[self window] makeFirstResponder:self];
} else {
[self endEditing];
}
[super mouseDown:event];
}
[[self window] invalidateCursorRectsForView:self];
}
- (BOOL) shouldDelayWindowOrderingForEvent:(NSEvent *)theEvent
{
return YES;
}
- editCell:theCell
{
int row, col;
if ([self getRow:&row column:&col ofCell:theCell]) {
[self editCellAt:row :col];
}
return self;
}
- editCellAt:(int) row :(int) col
{
NSRect cellFrame = [self cellFrameAtRow:row column:col];
[[self cellAtRow:row column:col] editTitle:NULL inRect:&cellFrame ofView:self];
return self;
}
- (void)endEditing
{
NSRect editorFrame;
id editor = [[self window] fieldEditor:NO forObject:self];
if (editor && [[self cells] indexOfObject:[editor delegate]] != NSNotFound) {
editorFrame = [editor frame];
[[self window] endEditingFor:self];
[self displayRect:editorFrame];
}
}
- (BOOL)abortEditing
{
return NO;
}
- (void)resetCursorRects
{
NSRect title;
id editor = [[self window] fieldEditor:NO forObject:self],
editingCell = [editor delegate],
selection = [self selectedCells],
theCell;
int row, col, i;
i = [selection count];
while (i--) {
if ([theCell = [selection objectAtIndex:i] isEditable] && theCell != editingCell) {
[self getRow:&row column:&col ofCell:theCell];
title = [self cellFrameAtRow:row column:col];
title = [theCell titleRectForBounds:title];
[self addCursorRect:title cursor:[NSCursor IBeamCursor]];
}
}
if ([[self cells] indexOfObject:editingCell] != NSNotFound) {
title = [editor frame];
[self addCursorRect:title cursor:[NSCursor IBeamCursor]];
}
}
- (void)drawCellInside:(NSCell *)theCell
{
int row, col;
[self getRow:&row column:&col ofCell:theCell];
[self drawCellAtRow:row column:col];
}
- (NSArray *)selectedCells
{
int i, j;
id aCell;
id selection = [NSMutableArray array];
for (i = 0; i < _numRows; i++) {
for (j = 0; j < _numCols; j++) {
aCell = [self cellAtRow:i column:j];
if ([aCell state] != 0)
[selection addObject:aCell];
}
}
return selection;
}
- (void)setCellSize:(NSSize)size
{
id editingCell = [[[self window] fieldEditor:NO forObject:self] delegate];
[self endEditing];
[super setCellSize:size];
if ([[self cells] indexOfObject:editingCell] != NSNotFound) {
[self editCell:editingCell];
}
}
- (void)setIntercellSpacing:(NSSize)size
{
id editingCell = [[[self window] fieldEditor:NO forObject:self] delegate];
[self endEditing];
[super setIntercellSpacing:size];
if ([[self cells] indexOfObject:editingCell] != NSNotFound) {
[self editCell:editingCell];
}
}
- (void)setFrameSize:(NSSize)_newSize
{
id editingCell = [[[self window] fieldEditor:NO forObject:self] delegate];
[self endEditing];
[super setFrameSize:(NSSize)_newSize];
if ([[self cells] indexOfObject:editingCell] != NSNotFound) {
[self editCell:editingCell];
}
}
- cellWithDelegate:delegate
{
id theCell;
int i;
for (i = 0; i < [[self cells] count]; i++) {
if ([theCell = [[self cells] objectAtIndex:i] delegate] == delegate) {
return theCell;
}
}
return nil;
}
- objectInColumn:(int) n
{
return [[self cellAtRow:0 column:n] delegate];
}
- (NSString *)stringValue
{
id delegate = [[self selectedCell] delegate];
return [delegate respondsToSelector:@selector(path)] ? [delegate path] : [super stringValue];
}
- (unsigned int) draggingSourceOperationMaskForLocal:(BOOL) isLocal
{
return NSDragOperationAll;
}
- (unsigned int) draggingEntered:(id <NSDraggingInfo>) sender
{
if(!draggingEntered) {
NSLog(@"draggingEntered");
draggingEntered = YES;
current = last = nil;
if ([self enteredNewCell:[sender draggingLocation]])
return [self cellEntered:sender];
else
return NSDragOperationNone;
} else {
return [self draggingUpdated:sender];
}
}
- (unsigned int) draggingUpdated:(id <NSDraggingInfo>) sender
{
NSLog(@"draggingUpdated");
if ([self enteredNewCell:[sender draggingLocation]]) {
if (last)
[self cellExited:sender];
return [self cellEntered:sender];
} else {
return current ? [self cellUpdated:sender] : [super draggingUpdated:sender];
}
}
- (void)draggingExited:(id <NSDraggingInfo>)sender
{
NSLog(@"draggingExited");
draggingEntered = NO;
last = current;
[self cellExited:sender];
}
- (BOOL)enteredNewCell:(NSPoint) where
{
int row, col;
id new;
where = [self convertPoint:where fromView:nil];
[self getRow:&row column:&col forPoint:where];
new = [self cellAtRow:row column:col];
if (new != current) {
last = current;
current = new;
return YES;
} else {
return NO;
}
}
- (unsigned int) cellEntered:(id <NSDraggingInfo>) sender
{
unsigned int op = NSDragOperationNone;
if(current) {
id delegate = [current delegate];
if ( delegate
&& [current isDragAccepting]
&& [delegate respondsToSelector:@selector(draggingEntered:)]
&& ((op = [delegate draggingEntered:sender]) != NSDragOperationNone)) {
[current setImage:[delegate acceptingDragImage]];
[self drawCell:current];
} else
NSLog(@"current set to nil");
current = nil;
}
return op;
}
- (unsigned int) cellUpdated:(id <NSDraggingInfo>) sender
{
unsigned int op = NSDragOperationNone;
if(current) {
id delegate = [current delegate];
if(delegate && [delegate respondsToSelector:@selector(draggingUpdated:)]) {
op = [delegate draggingUpdated:sender];
} else {
op = [super draggingUpdated:sender];
}
}
return op;
}
- (void)cellExited:(id <NSDraggingInfo>) sender
{
if(last) {
id delegate = [last delegate];
if (delegate && [delegate respondsToSelector:@selector(draggingExited)]) {
[delegate draggingExited:sender];
}
[last setImage:[delegate image]];
[self drawCell:last];
}
}
- (BOOL) prepareForDragOperation:(id <NSDraggingInfo>) sender
{
id delegate = [current delegate];
NSLog(@"prepareForDragOperation");
[current setImage:[delegate image]];
[self drawCell:current];
return [delegate respondsToSelector:@selector(prepareForDragOperation:)] ?
[delegate prepareForDragOperation:sender]:
YES;
}
- (BOOL) performDragOperation:(id <NSDraggingInfo>) sender
{
id delegate = [current delegate];
return [delegate respondsToSelector:@selector(performDragOperation:)] ?
[delegate performDragOperation:sender]:
NO;
}
- (void)concludeDragOperation:(id <NSDraggingInfo>)sender
{
id delegate = [current delegate];
return [delegate respondsToSelector:@selector(concludeDragOperation:)] ?
[delegate concludeDragOperation:sender]:
nil;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.