|
|
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: * Controller
9: *
10: * Category Of: EOFDelegate
11: *
12: * Conforms To: None
13: *
14: * Declared In: EOFDelegateControllerCategory.h
15: *
16: *
17: *------------------------------------------------------------------------*/
18: #import "EOFDelegateControllerCategory.h"
19:
20:
21:
22:
23: @implementation EOFDelegate (Controller)
24:
25: /*--------------------------------------------------------------------------
26: * EOController Delegate Methods
27: *
28: * Note that the insert, delete, and update operations are buffered until an
29: * -saveToDataSource message is sent to the controller. The delegate receives
30: * delegate messages for these operations as the insert, delete, and update
31: * operations are sent to the controller. The delegate receives different
32: * delegate messages when the buffered operations are actually sent on to the
33: * data source.
34: *
35: * typedef enum {
36: * EONoDataSourceFailure = 0,
37: * EOContinueDataSourceFailureResponse,
38: * EORollbackDataSourceFailureResponse
39: * } EODataSourceFailureResponse;
40: *
41: * These return values allow a controller's delegate to determine what
42: * action should be taken on a failure. EONoDataSourceFailure means there
43: * was no failure; EOContinuteDataSourceFailureResponse means that the
44: * failure should be ignored and the operation should continue;
45: * EORollbackDataSourceFailureResponse means that the controller should
46: * roll back the data source. EORollbackDataSourceFailureResponse is only
47: * useful if the data source conforms to the EORollbackDataSource
48: * protocol.
49: *
50: *------------------------------------------------------------------------*/
51: - (void)controllerDidChangeSelection:(EOController *)controller
52: {
53: // Sent when the selection changes.
54:
55: [[NXApp delegate] announce:controller selector:_cmd];
56: }
57:
58:
59: - (BOOL)controllerWillFetch:(EOController *)controller
60: {
61: // Informs the delegate that the controller is about to fetch. If the
62: // delegate returns no the fetch fails; if the delegate returns YES
63: // the fetch proceeds.
64:
65: BOOL result = YES;
66:
67: [[NXApp delegate] announce:controller selector:_cmd];
68:
69: if ([[NXApp delegate] wantsAlertPanels] == YES)
70: {
71: switch (NXRunAlertPanel ("EOController",
72: "%s", "YES", "NO", NULL, sel_getName(_cmd)))
73: {
74: case NX_ALERTALTERNATE:
75: result = NO;
76: break;
77: case NX_ALERTDEFAULT:
78: default:
79: result = YES;
80: break;
81: }
82: }
83:
84: return result;
85: }
86:
87:
88: - (void)controller:(EOController *)controller didFetchObjects: (NSArray *)objects
89: {
90: // Informs the delegate that the controller has fetched object.
91:
92: [[NXApp delegate] announce:controller
93: selector:_cmd
94: with:[NSArray arrayWithObject:objects]];
95: }
96:
97:
98: - (BOOL)controller:(EOController *)controller
99: willInsertObject:object
100: atIndex: (unsigned)newIndex
101: {
102: // If the delegate returns NO object is released and not inserted.
103:
104: BOOL result = YES;
105:
106: [[NXApp delegate] announce:controller
107: selector:_cmd
108: with:[NSArray arrayWithObject:object]];
109:
110: if ([[NXApp delegate] wantsAlertPanels] == YES)
111: {
112: switch (NXRunAlertPanel ("EOController",
113: "%s", "YES", "NO", NULL, sel_getName(_cmd)))
114: {
115: case NX_ALERTALTERNATE:
116: result = NO;
117: break;
118: case NX_ALERTDEFAULT:
119: default:
120: result = YES;
121: break;
122: }
123: }
124:
125: return result;
126: }
127:
128:
129: - (void)controller:(EOController *)controller didInsertObject:object
130: {
131: // Informs the delegate that the controller has inserted object.
132:
133: [[NXApp delegate] announce:controller
134: selector:_cmd
135: with:[NSArray arrayWithObject:object]];
136: }
137:
138:
139: - (BOOL)controller:(EOController *)controller willDeleteObject:object
140: {
141: // If the delegate returns NO object is not deleted.
142:
143: BOOL result = YES;
144:
145: [[NXApp delegate] announce:controller
146: selector:_cmd
147: with:[NSArray arrayWithObject:object]];
148:
149: if ([[NXApp delegate] wantsAlertPanels] == YES)
150: {
151: switch (NXRunAlertPanel ("EOController",
152: "%s", "YES", "NO", NULL, sel_getName(_cmd)))
153: {
154: case NX_ALERTALTERNATE:
155: result = NO;
156: break;
157: case NX_ALERTDEFAULT:
158: default:
159: result = YES;
160: break;
161: }
162: }
163:
164: return result;
165: }
166:
167:
168: - (void)controller:(EOController *)controller didDeleteObject:object
169: {
170: // Informs the delegate that the controller has deleted object.
171:
172: [[NXApp delegate] announce:controller
173: selector:_cmd
174: with:[NSArray arrayWithObject:object]];
175: }
176:
177:
178: - (NSDictionary *)controller:(EOController *)controller
179: willSaveEdits: (NSDictionary *)edits
180: toObject:object
181: {
182: // Invoked by -saveObjects for each object before
183: // -takeValuesFromDictionary: is sent to the object. If the delegate
184: // responds nil -takeValuesFromDictionary: is not sent and the controller
185: // aborts -saveToObjects. The edits will be ignored and the associations
186: // will not be notified of any change. If the delegate returns a
187: // dictionary that dictionary will be sent to the object. This method is
188: // useful for doing validation prior to data actually being sent to the
189: // object and will also prevent the UI from refreshing.
190:
191: id result = edits;
192:
193: [[NXApp delegate] announce:controller
194: selector:_cmd
195: with:[NSArray arrayWithObjects: edits, object, nil]];
196:
197: if ([[NXApp delegate] wantsAlertPanels] == YES)
198: {
199: switch (NXRunAlertPanel ("EOController",
200: "%s", "YES", "NO", NULL, sel_getName(_cmd)))
201: {
202: case NX_ALERTALTERNATE:
203: result = nil;
204: break;
205: case NX_ALERTDEFAULT:
206: default:
207: result = edits;
208: break;
209: }
210: }
211:
212: return result;
213: }
214:
215:
216: - (void)controller:(EOController *)controller didSaveToObject:object
217: {
218: // Informs the delegate that the controller has saved object.
219:
220: [[NXApp delegate] announce:controller
221: selector:_cmd
222: with:[NSArray arrayWithObject:object]];
223: }
224:
225:
226: /*--------------------------------------------------------------------------
227: * NOTE
228: *
229: * The following two methods have been commented out to allow natural
230: * processing of associated events. See comments below for these methods.
231: *
232:
233: - (BOOL)controllerWillDiscardEdits:(EOController *)controller
234: {
235: // Sent during the -fetch method before the fetch begins if there are any
236: // operations that haven't been saved to the objects. Also sent when a
237: // selection is about to change, causing a detail controller to flush its
238: // caches. The operation is aborted if this method returns NO. The
239: // delegate should send -saveToObjects if it wants to preserve the
240: // changes. If the delegate doesn't implement this method the controller
241: // opens an alert panel warning the user that edits may be lost.
242:
243: BOOL result = YES;
244:
245: [[NXApp delegate] announce:controller selector:_cmd];
246:
247: if ([[NXApp delegate] wantsAlertPanels] == YES)
248: {
249: switch (NXRunAlertPanel ("EOController",
250: "%s", "YES", "NO", NULL, sel_getName(_cmd)))
251: {
252: case NX_ALERTALTERNATE:
253: result = NO;
254: break;
255: case NX_ALERTDEFAULT:
256: default:
257: result = YES;
258: break;
259: }
260: }
261:
262: return result;
263: }
264:
265:
266: - (BOOL)controllerWillDiscardOperations:(EOController *)controller
267: {
268: // Sent during the -fetch method before the fetch begins if there are any
269: // operations that haven't been saved to the data source. Also sent
270: // when a selection is about to change, causing a detail controller to
271: // flush its caches. The fetch is aborted if this method returns NO.
272: // The delegate should invoke -saveToDataSource if it wants to preserve the
273: // changes. If the delegate doesn't implement this method the controller
274: // opens an alert panel warning the user that updates may be lost.
275:
276: BOOL result = YES;
277:
278: [[NXApp delegate] announce:controller selector:_cmd];
279:
280: if ([[NXApp delegate] wantsAlertPanels] == YES)
281: {
282: switch (NXRunAlertPanel ("EOController",
283: "%s", "YES", "NO", NULL, sel_getName(_cmd)))
284: {
285: case NX_ALERTALTERNATE:
286: result = NO;
287: break;
288: case NX_ALERTDEFAULT:
289: default:
290: result = YES;
291: break;
292: }
293: }
294:
295: return result;
296: }
297: *------------------------------------------------------------------------*/
298:
299:
300:
301: - (BOOL)controllerWillSaveToDataSource:(EOController *)controller
302: {
303: // These delegate messages are sent as the data source is notified of
304: // changes to data-bearing objects. If the savesToDataSourceAutomatically
305: // flag is turned off and -saveToDataSource is invoked then the delegate
306: // is notified of each buffered operation.
307:
308: BOOL result = YES;
309:
310: [[NXApp delegate] announce:controller selector:_cmd];
311:
312: if ([[NXApp delegate] wantsAlertPanels] == YES)
313: {
314: switch (NXRunAlertPanel ("EOController",
315: "%s", "YES", "NO", NULL, sel_getName(_cmd)))
316: {
317: case NX_ALERTALTERNATE:
318: result = NO;
319: break;
320: case NX_ALERTDEFAULT:
321: default:
322: result = YES;
323: break;
324: }
325: }
326:
327: return result;
328: }
329:
330:
331: - (void)controllerDidSaveToDataSource:(EOController *)controller
332: {
333: // These delegate messages are sent as the data source is notified of
334: // changes to data-bearing objects. If the savesToDataSourceAutomatically
335: // flag is turned off and -saveToDataSource is invoked then the delegate
336: // is notified of each buffered operation.
337:
338: [[NXApp delegate] announce:controller selector:_cmd];
339: }
340:
341:
342: - (EODataSourceOperationDelegateResponse)controller:(EOController *)controller
343: willInsertObject:object
344: inDataSource:dataSource
345: {
346: int result = EOPerformDataSourceOperation;
347:
348: [[NXApp delegate] announce:controller
349: selector:_cmd
350: with:[NSArray arrayWithObjects: object, dataSource, nil]];
351:
352: if ([[NXApp delegate] wantsAlertPanels] == YES)
353: {
354: switch (NXRunAlertPanel ("EOController",
355: "%s", "YES", "NO", NULL, sel_getName(_cmd)))
356: {
357: case NX_ALERTALTERNATE:
358: result = EODiscardDataSourceOperation;
359: break;
360: case NX_ALERTDEFAULT:
361: default:
362: result = EOPerformDataSourceOperation;
363: break;
364: }
365: }
366:
367: return result;
368: }
369:
370:
371: - (EODataSourceFailureResponse)controller:(EOController *)controller
372: failedToInsertObject:object
373: inDataSource:dataSource
374: {
375: int result = EONoDataSourceFailure;
376:
377: [[NXApp delegate] announce:controller
378: selector:_cmd
379: with:[NSArray arrayWithObjects: object, dataSource, nil]];
380:
381: if ([[NXApp delegate] wantsAlertPanels] == YES)
382: {
383: switch (NXRunAlertPanel ("EOController",
384: "%s", "No Failure", "Continue", "Rollback", sel_getName(_cmd)))
385: {
386: case NX_ALERTOTHER:
387: result = EORollbackDataSourceFailureResponse;
388: break;
389: case NX_ALERTALTERNATE:
390: result = EOContinueDataSourceFailureResponse;
391: break;
392: case NX_ALERTDEFAULT:
393: default:
394: result = EONoDataSourceFailure;
395: break;
396: }
397: }
398:
399: return result;
400: }
401:
402:
403: - (void)controller:(EOController *)controller
404: didInsertObject:object
405: inDataSource:dataSource
406: {
407: [[NXApp delegate] announce:controller
408: selector:_cmd
409: with:[NSArray arrayWithObjects: object, dataSource, nil]];
410: }
411:
412:
413: - (EODataSourceOperationDelegateResponse)controller:(EOController *)controller
414: willDeleteObject:object
415: inDataSource:dataSource
416: {
417: int result = EOPerformDataSourceOperation;
418:
419: [[NXApp delegate] announce:controller
420: selector:_cmd
421: with:[NSArray arrayWithObjects: object, dataSource, nil]];
422:
423: if ([[NXApp delegate] wantsAlertPanels] == YES)
424: {
425: switch (NXRunAlertPanel ("EOController",
426: "%s", "YES", "NO", NULL, sel_getName(_cmd)))
427: {
428: case NX_ALERTALTERNATE:
429: result = EODiscardDataSourceOperation;
430: break;
431: case NX_ALERTDEFAULT:
432: default:
433: result = EOPerformDataSourceOperation;
434: break;
435: }
436: }
437:
438: return result;
439: }
440:
441:
442: - (EODataSourceFailureResponse)controller:(EOController *)controller
443: failedToDeleteObject:object
444: inDataSource:dataSource
445: {
446: int result = EONoDataSourceFailure;
447:
448: [[NXApp delegate] announce:controller
449: selector:_cmd
450: with:[NSArray arrayWithObjects: object, dataSource, nil]];
451:
452: if ([[NXApp delegate] wantsAlertPanels] == YES)
453: {
454: switch (NXRunAlertPanel ("EOController",
455: "%s", "No Failure", "Continue", "Rollback", sel_getName(_cmd)))
456: {
457: case NX_ALERTOTHER:
458: result = EORollbackDataSourceFailureResponse;
459: break;
460: case NX_ALERTALTERNATE:
461: result = EOContinueDataSourceFailureResponse;
462: break;
463: case NX_ALERTDEFAULT:
464: default:
465: result = EONoDataSourceFailure;
466: break;
467: }
468: }
469:
470: return result;
471: }
472:
473:
474: - (void)controller:(EOController *)controller
475: didDeleteObject:object
476: inDataSource:dataSource
477: {
478: [[NXApp delegate] announce:controller
479: selector:_cmd
480: with:[NSArray arrayWithObjects: object, dataSource, nil]];
481: }
482:
483:
484: - (EODataSourceOperationDelegateResponse)controller:(EOController *)controller
485: willUpdateObject:object
486: inDataSource:dataSource
487: {
488: int result = EOPerformDataSourceOperation;
489:
490: [[NXApp delegate] announce:controller
491: selector:_cmd
492: with:[NSArray arrayWithObjects: object, dataSource, nil]];
493:
494: if ([[NXApp delegate] wantsAlertPanels] == YES)
495: {
496: switch (NXRunAlertPanel ("EOController",
497: "%s", "YES", "NO", NULL, sel_getName(_cmd)))
498: {
499: case NX_ALERTALTERNATE:
500: result = EODiscardDataSourceOperation;
501: break;
502: case NX_ALERTDEFAULT:
503: default:
504: result = EOPerformDataSourceOperation;
505: break;
506: }
507: }
508:
509: return result;
510: }
511:
512:
513: - (EODataSourceFailureResponse)controller:(EOController *)controller
514: failedToUpdateObject:object
515: inDataSource:dataSource;
516: {
517: int result = EONoDataSourceFailure;
518:
519: [[NXApp delegate] announce:controller
520: selector:_cmd
521: with:[NSArray arrayWithObjects: object, dataSource, nil]];
522:
523: if ([[NXApp delegate] wantsAlertPanels] == YES)
524: {
525: switch (NXRunAlertPanel ("EOController",
526: "%s", "No Failure", "Continue", "Rollback", sel_getName(_cmd)))
527: {
528: case NX_ALERTOTHER:
529: result = EORollbackDataSourceFailureResponse;
530: break;
531: case NX_ALERTALTERNATE:
532: result = EOContinueDataSourceFailureResponse;
533: break;
534: case NX_ALERTDEFAULT:
535: default:
536: result = EONoDataSourceFailure;
537: break;
538: }
539: }
540:
541: return result;
542: }
543:
544:
545: - (void)controller:(EOController *)controller
546: didUpdateObject:object
547: inDataSource:dataSource
548: {
549: [[NXApp delegate] announce:controller
550: selector:_cmd
551: with:[NSArray arrayWithObjects: object, dataSource, nil]];
552: }
553:
554:
555: - (void)controller:(EOController *)controller
556: willRollbackDataSource:(id <EODataSources>)dataSource
557: {
558: [[NXApp delegate] announce:controller
559: selector:_cmd
560: with:[NSArray arrayWithObject: dataSource]];
561: }
562:
563:
564: - (void)controller:(EOController *)controller
565: didRollbackDataSource:(id <EODataSources>)dataSource
566: {
567: [[NXApp delegate] announce:controller
568: selector:_cmd
569: with:[NSArray arrayWithObject: dataSource]];
570: }
571:
572:
573: - (BOOL)controllerWillUndo:(EOController *)controller
574: {
575: BOOL result = YES;
576:
577: [[NXApp delegate] announce:controller selector:_cmd];
578:
579: if ([[NXApp delegate] wantsAlertPanels] == YES)
580: {
581: switch (NXRunAlertPanel ("EOController",
582: "%s", "YES", "NO", NULL, sel_getName(_cmd)))
583: {
584: case NX_ALERTALTERNATE:
585: result = NO;
586: break;
587: case NX_ALERTDEFAULT:
588: default:
589: result = YES;
590: break;
591: }
592: }
593:
594: return result;
595: }
596:
597:
598: - (void)controllerDidUndo:(EOController *)controller
599: {
600: [[NXApp delegate] announce:controller selector:_cmd];
601:
602: }
603:
604:
605: - (void)controller:(EOController *)controller
606: didChangeDataSource: (id <EODataSources>)dataSource
607: {
608: [[NXApp delegate] announce:controller
609: selector:_cmd
610: with:[NSArray arrayWithObject: dataSource]];
611: }
612:
613:
614: - (void)controller:(EOController *)controller
615: association: (EOAssociation *)association
616: didEditObject: anObject
617: key: (NSString *)key
618: value: aValue
619: {
620: [[NXApp delegate] announce:controller
621: selector:_cmd
622: with:[NSArray arrayWithObjects:
623: association, anObject, key, aValue, nil]];
624: }
625:
626:
627: - (BOOL)controller:(EOController *)controller willUndoObject:anObject
628: {
629: BOOL result = YES;
630:
631: [[NXApp delegate] announce:controller
632: selector:_cmd
633: with:[NSArray arrayWithObject: anObject]];
634:
635: if ([[NXApp delegate] wantsAlertPanels] == YES)
636: {
637: switch (NXRunAlertPanel ("EOController",
638: "%s", "YES", "NO", NULL, sel_getName(_cmd)))
639: {
640: case NX_ALERTALTERNATE:
641: result = NO;
642: break;
643: case NX_ALERTDEFAULT:
644: default:
645: result = YES;
646: break;
647: }
648: }
649:
650: return result;
651: }
652:
653:
654: - (void)controller:(EOController *)controller didUndoObject:anObject
655: {
656: [[NXApp delegate] announce:controller
657: selector:_cmd
658: with:[NSArray arrayWithObject: anObject]];
659: }
660:
661: // This delegate method can be implemented to respond when the controller is
662: // unable to create an object for a data source. If the delegate does not
663: // implement this method, the controller will put up a panel to alert the user
664: // of the error. Otherwise, the delegate is responsible for notifying the user.
665: - (void) controller:(EOController *)controller
666: createObjectFailedForDataSource:dataSource
667: {
668: [[NXApp delegate] announce:controller
669: selector:_cmd
670: with:[NSArray arrayWithObject: dataSource]];
671: }
672:
673: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.