|
|
1.1 root 1: /*--------------------------------------------------------------------------
2: *
3: * You may freely copy, distribute, and reuse the code in this example.
4: * SHL Systemhouse disclaims any warranty of any kind, expressed or
5: * implied, as to its fitness for any particular use.
6: *
7: *
8: * IconWell
9: *
10: * Inherits From: View
11: *
12: * Conforms To: None
13: *
14: * Declared In: IconWell.h
15: *
16: *------------------------------------------------------------------------*/
17: #import "IconWell.h"
18: #import <appkit/appkit.h>
19:
20:
21:
22:
23: @implementation IconWell
24:
25: /*--------------------------------------------------------------------------
26: * Private
27: *------------------------------------------------------------------------*/
28: - (NXPoint) _centerPointForImage: anImage
29: {
30: NXSize imageSize;
31: NXRect boundsRect;
32:
33: [self getBounds: &boundsRect];
34: [anImage getSize: &imageSize];
35:
36: if (imageSize.width < NX_WIDTH (&boundsRect))
37: NX_X (&boundsRect) += (NX_WIDTH (&boundsRect)
38: - imageSize.width ) / 2.0;
39:
40: if (imageSize.height < NX_HEIGHT (&boundsRect))
41: NX_Y (&boundsRect) += (NX_HEIGHT (&boundsRect)
42: - imageSize.height ) / 2.0;
43:
44: return boundsRect.origin;
45: }
46:
47:
48: - _dragOperationFor: (NXEvent*) originalEvent nextEvent: (NXEvent*) nextEvent
49: {
50: id pasteboard;
51: NXPoint offset = { 0.0, 0.0 };
52: NXRect iconRect;
53:
54: if (path == NULL) return self;
55: iconRect.origin = [self _centerPointForImage:icon];
56: pasteboard = [Pasteboard newName: NXDragPboard];
57: [pasteboard declareTypes:&NXFilenamePboardType num:1 owner:self];
58: [pasteboard writeType:NXFilenamePboardType data:path
59: length:strlen(path)+1];
60:
61: [self dragImage:icon at:&iconRect.origin offset:&offset event:originalEvent
62: pasteboard:pasteboard source:self slideBack:YES];
63:
64: if (pasteboard) [pasteboard free];
65: // [self notifyDelegateDidDrag];
66: return self;
67: }
68:
69:
70: /*--------------------------------------------------------------------------
71: * Initialization and Freeing
72: *------------------------------------------------------------------------*/
73: - initFrame:(const NXRect *)frameRect
74: {
75: [super initFrame: frameRect];
76: [self registerForDraggedTypes: &NXFilenamePboardType count: 1];
77: return self;
78: }
79:
80:
81: - free
82: {
83: if (icon) [icon free];
84: if (path) NX_FREE (path);
85: return [super free];
86: }
87:
88:
89: /*--------------------------------------------------------------------------
90: * Accessors
91: *------------------------------------------------------------------------*/
92: - icon
93: {
94: return icon;
95: }
96:
97:
98: - setIcon:anIcon
99: {
100: if (icon && icon != anIcon) [icon free];
101: icon = anIcon;
102: [self update];
103: return self;
104: }
105:
106:
107: - (const char *)path
108: {
109: return path;
110: }
111:
112:
113: - setPath:(const char *)aPath
114: {
115: if (path && path != aPath) NX_FREE (path);
116: path = aPath ? NXCopyStringBuffer(aPath) : NULL;
117: return self;
118: }
119:
120:
121: /*--------------------------------------------------------------------------
122: * Event Handling
123: *------------------------------------------------------------------------*/
124: - (BOOL)acceptsFirstMouse
125: {
126: return YES;
127: }
128:
129:
130: - mouseDown: (NXEvent*) theEvent
131: {
132: int originalEventMask, newEventMask;
133: NXEvent originalEvent = *theEvent, nextEvent;
134:
135: if (path == NULL) return self;
136:
137: [NXApp preventWindowOrdering];
138: originalEventMask = [window addToEventMask: NX_MOUSEDRAGGEDMASK];
139: newEventMask = (NX_MOUSEUPMASK | NX_MOUSEDRAGGEDMASK);
140: nextEvent = *([NXApp getNextEvent: newEventMask]);
141:
142: switch (nextEvent.type)
143: {
144: case NX_MOUSEDRAGGED:
145: // if ([self notifyDelegateWillDrag] == YES)
146: [self _dragOperationFor: &originalEvent nextEvent: &nextEvent];
147: break;
148:
149: case NX_MOUSEUP:
150: default:
151: break;
152: }
153:
154: [window setEventMask: originalEventMask];
155: return self;
156: }
157:
158:
159: /*--------------------------------------------------------------------------
160: * Delegate
161: *------------------------------------------------------------------------*/
162: - delegate
163: {
164: return delegate;
165: }
166:
167:
168: - setDelegate: anObject
169: {
170: delegate = anObject;
171: return self;
172: }
173:
174:
175: /*--------------------------------------------------------------------------
176: * Drawing
177: *------------------------------------------------------------------------*/
178: - drawSelf:(const NXRect *)rects :(int)rectCount
179: {
180: NXPoint point = [self _centerPointForImage:icon];
181:
182: PSsetgray(NX_LTGRAY);
183: PSrectfill(bounds.origin.x, bounds.origin.y, bounds.size.width,
184: bounds.size.height);
185:
186: [icon composite:NX_SOVER toPoint:&point];
187: return self;
188: }
189:
190:
191: /*--------------------------------------------------------------------------
192: * Dragging
193: *------------------------------------------------------------------------*/
194: - (NXDragOperation) draggingSourceOperationMaskForLocal: (BOOL)isLocal;
195: {
196: return NX_DragOperationCopy;
197: }
198:
199:
200: - (NXDragOperation) draggingEntered:dragSource
201: {
202: return NX_DragOperationCopy;
203: }
204:
205:
206: - (NXDragOperation) draggingUpdated:dragSource
207: {
208: if ([dragSource draggingSource] == self)
209: return NX_DragOperationNone;
210:
211: return NX_DragOperationCopy;
212: }
213:
214:
215: - (BOOL) prepareForDragOperation:dragSource
216: {
217: // return [self notifyDelegateWillDrag];
218: return YES;
219: }
220:
221:
222: - (BOOL) performDragOperation:dragSource
223: {
224: id pasteboard;
225: char* data;
226: int length;
227:
228: pasteboard = [dragSource draggingPasteboard];
229: [pasteboard readType:NXFilenamePboardType data:&data length:&length];
230: if (strchr (data, '\t')) return NO;
231: [self setPath: data];
232: [self setIcon: [dragSource draggedImageCopy]];
233: [pasteboard deallocatePasteboardData:data length:length];
234: return YES;
235: }
236:
237:
238: - notifyDelegateDidDrop: aDragSource
239: {
240: if ([delegate respondsTo: @selector (dragSource:didDropOnIconWell:)])
241: [delegate dragSource: aDragSource didDropOnIconWell: self];
242:
243: return self;
244: }
245:
246:
247: - concludeDragOperation:dragSource
248: {
249: [self notifyDelegateDidDrop: dragSource];
250: [self update];
251: return self;
252: }
253:
254:
255: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.