1/* 2 GNUstep ProjectCenter - http://www.gnustep.org/experience/ProjectCenter.html 3 4 Copyright (C) 2005 Free Software Foundation 5 6 Authors: Serg Stoyan 7 8 This file is part of GNUstep. 9 10 This application is free software; you can redistribute it and/or 11 modify it under the terms of the GNU General Public 12 License as published by the Free Software Foundation; either 13 version 2 of the License, or (at your option) any later version. 14 15 This application is distributed in the hope that it will be useful, 16 but WITHOUT ANY WARRANTY; without even the implied warranty of 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 Library General Public License for more details. 19 20 You should have received a copy of the GNU General Public 21 License along with this library; if not, write to the Free 22 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. 23*/ 24 25#import <AppKit/AppKit.h> 26 27#import <ProjectCenter/PCDefines.h> 28#import <ProjectCenter/PCFileNameIcon.h> 29#import <ProjectCenter/PCProjectBrowser.h> 30 31@implementation PCFileNameIcon 32 33- (void)awakeFromNib 34{ 35 filePath = nil; 36 [self setRefusesFirstResponder:YES]; 37// [self setEditable:NO]; // prevents dragging 38// [self setImage:[NSImage imageNamed:@"ProjectCenter"]]; 39 [self 40 registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; 41} 42 43- (id)initWithFrame:(NSRect)frameRect 44{ 45 self = [super initWithFrame:frameRect]; 46 47 filePath = nil; 48 [self setRefusesFirstResponder:YES]; 49// [self setEditable:NO]; // prevents dragging 50// [self setImage:[NSImage imageNamed:@"ProjectCenter"]]; 51 52 return self; 53} 54 55- (void)dealloc 56{ 57#ifdef DEBUG 58 NSLog (@"PCFileNameIcon: dealloc"); 59#endif 60 61 [[NSNotificationCenter defaultCenter] removeObserver:self]; 62 63 RELEASE(fileNameField); 64 RELEASE(delegate); 65 RELEASE(filePath); 66 67 [super dealloc]; 68} 69 70- (void)setFileNameField:(NSTextField *)field 71{ 72 fileNameField = RETAIN(field); 73} 74 75- (void)setDelegate:(id)object 76{ 77 ASSIGN(delegate, object); 78} 79 80- (void)updateIcon 81{ 82 if (delegate) 83 { 84 if ([delegate respondsToSelector:@selector(fileNameIconImage)]) 85 { 86 [self setImage:[delegate fileNameIconImage]]; 87 } 88 if ((fileNameField != nil) && 89 [delegate respondsToSelector:@selector(fileNameIconTitle)]) 90 { 91 [fileNameField setStringValue:[delegate fileNameIconTitle]]; 92 } 93 if ([delegate respondsToSelector:@selector(fileNameIconPath)]) 94 { 95 ASSIGN(filePath, [delegate fileNameIconPath]); 96 } 97 } 98} 99 100// --- Drag and drop 101 102- (void)mouseDown:(NSEvent *)theEvent 103{ 104 NSArray *fileList = [NSArray arrayWithObjects:filePath, nil]; 105 NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard]; 106 NSPoint dragPosition; 107 108 [pboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType] 109 owner:nil]; 110 [pboard setPropertyList:fileList forType:NSFilenamesPboardType]; 111 112 // Start the drag operation 113 dragPosition = [self convertPoint:[theEvent locationInWindow] 114 fromView:nil]; 115 dragPosition.x -= 16; 116 dragPosition.y -= 16; 117 118 [self dragImage:[self image] 119 at:dragPosition 120 offset:NSZeroSize 121 event:theEvent 122 pasteboard:pboard 123 source:self 124 slideBack:YES]; 125} 126 127// --- NSDraggingDestination protocol methods 128// -- Before the image is released 129- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender 130{ 131 NSPasteboard *pb = [sender draggingPasteboard]; 132 NSArray *paths = [pb propertyListForType:NSFilenamesPboardType]; 133 NSDragOperation draggingOp = NSDragOperationNone; 134 135// NSLog(@"Dragging entered: %@", paths); 136 137 if (![paths isKindOfClass:[NSArray class]] || [paths count] == 0) 138 { 139 return draggingOp; 140 } 141 142 if (delegate && 143 [delegate respondsToSelector:@selector(canPerformDraggingOf:)] && 144 [delegate canPerformDraggingOf:paths] == YES) 145 { 146 draggingOp = NSDragOperationCopy; 147 } 148 149 if (draggingOp == NSDragOperationCopy) 150 { // TODO: Change icon to icon that shows open state of destination 151 } 152 153 return draggingOp; 154} 155 156- (void)draggingExited:(id <NSDraggingInfo>)sender 157{ 158 NSLog(@"Dragging exited"); 159} 160 161// -- After the image is released 162- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender 163{ 164 NSPasteboard *pb = [sender draggingPasteboard]; 165 NSArray *paths = [pb propertyListForType:NSFilenamesPboardType]; 166 167 NSLog(@"Prepare for drag operation"); 168 169 if (delegate && 170 [delegate respondsToSelector:@selector(prepareForDraggingOf:)]) 171 { 172 return [delegate prepareForDraggingOf:paths]; 173 } 174 return YES; 175} 176 177- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender 178{ 179 NSPasteboard *pb = [sender draggingPasteboard]; 180 NSArray *paths = [pb propertyListForType:NSFilenamesPboardType]; 181 182 NSLog(@"performDragOperation: %@", paths); 183 184 if (delegate && 185 [delegate respondsToSelector:@selector(performDraggingOf:)]) 186 { 187 return [delegate performDraggingOf:paths]; 188 } 189 190 return YES; 191} 192 193- (void)concludeDragOperation:(id <NSDraggingInfo>)sender 194{ 195 NSPasteboard *pb = [sender draggingPasteboard]; 196 NSArray *paths = [pb propertyListForType:NSFilenamesPboardType]; 197 198 NSLog(@"Conclude drag operation"); 199 200 if (delegate && 201 [delegate respondsToSelector:@selector(concludeDraggingOf:)]) 202 { 203 [delegate concludeDraggingOf:paths]; 204 } 205} 206 207// --- NSDraggingSource protocol methods 208 209- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal 210{ 211 return NSDragOperationCopy; 212} 213 214@end 215 216