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