This is MiscSwapContentsController.m in view mode; [Download] [Up]
{\rtf0\ansi{\fonttbl\f0\fmodern Courier;}
\paperw11760
\paperh7800
\margl120
\margr120
\pard\tx560\tx1120\tx1680\tx2260\tx2800\tx3360\tx3940\tx4480\tx10360\tx11520\f0\b0\i0\ulnone\fs24\fc0\cf0 /* MiscSwapContentsController.m \
*\
* A very simple class for controlling swapAble views. A subclass is a must \
* to easily work with the MiscSwapView classes.\
*\
* For more interface-info see the header file. In depth information\
* can be found here in the source-code.\
*\
* Written by: Thomas Engel\
* Created: 24.01.1994 (Copyleft)\
* Last Modified: 25.09.1994\
\b Changes are in black bold.
\b0 \
*/\
\
//#import "MiscSwapContentsController.h"\
#import "MiscSwapView.h"\
#import "MiscSwapContentsController.h"\
//#import <misckit/misckit.h>\
\
// Defined in order to do archiving and versioning properly, so\
// if the archiving changes we will be able to read all versions.\
\
#define MISC_SCC_VERSION 0\
#define MISC_SCC_CLASSNAME "MiscSwapContentsController"\
\
\
\b // Declarations of private methods that need not be in the\
// header file.
\b0 \
\
@interface MiscSwapContentsController (PrivateMethods)\
\
- _dispatchToDelegate: (SEL)message;\
- _dispatchToDelegate: (SEL)message with: anObject;\
\
@end\
\
\
@implementation MiscSwapContentsController\
\
+ initialize\
\{\
// Sets the version of this class for archiving purposes.\
\
if (self == [MiscSwapContentsController class])\
[self setVersion: MISC_SCC_VERSION];\
\
return self;\
\}\
\
- init\
\{\
[super init];\
\
swapView = nil;\
view = nil;\
trigger = nil;\
triggerTag = 0;\
delegate = nil;\
\
return self;\
\}\
\
- setSwapView:aView\
\{\
// Here we set our swapView. This objects is the right place to\
// register ourselves for the swapping. But only if we have a trigger..\
// otherwise we have to wait for a awakeFromNib message.\
// Sorry we can only register for one swapView at a time. So if we had\
// a swapView before..lets say good bye.\
\
if( swapView ) [swapView removeController:self];\
\
swapView = aView;\
\
\b // I removed the necessity that the trigger has to be set to something\
// before adding ourselves to the swapview's list of controllers. The\
// swapView class was also changed so it would treat controllers with\
// no trigger in the correct way, since you can depend upon tags and\
// not use any controllers. \
// You also do not need awakeFromNib anymore.\
\
[swapView addController: self];\
\b0 \
return self;\
\}\
\
- swapView\
\{\
if (swapView != nil)\
return swapView;\
\
// If we aren't pointing to a swapview maybe our delegate\
// knows something we don't. I don't really know why you\
// would have the delegate know the swapView, but it is \
// here for consistency. \
\b return [self _dispatchToDelegate: @selector(swapView)];
\b0 \
\
\}\
\
- setView:aView\
\{\
view = aView;\
return self;\
\}\
\
- view\
\{\
if (view != nil)\
return view;\
\
// This way you can have views that are all in seperate nibs and\
// have the delegate get them when they are needed.\
\b return [self _dispatchToDelegate: @selector(view)];
\b0 \
\}\
\
- setTrigger:anObject\
\{\
// The trigger is the object we are related to. By default we try to set\
// the triggerTag according to that object.\
// Activating the trigger object (or an object with this tag) will cause\
// us to swap in.\
\
trigger = anObject;\
\
if( [trigger respondsTo:@selector(tag)] )\
[self setTriggerTag:[trigger tag]];\
else [self setTriggerTag:0];\
\
return self;\
\}\
\
- trigger\
\{\
return trigger;\
\}\
\
- setTriggerTag:(int)tag\
\{\
// Sets the tag we will be activated for.\
// Working with tags frees us from having to know what typ of object caused\
// the action (TextCell,ButtonCell,Matrix or what ever..) as long as the\
// tags are handled the right way.\
\
triggerTag = tag;\
return self;\
\}\
\
- (int)triggerTag\
\{\
return triggerTag;\
\}\
\
\b // As an alternative to subclassing this controller to "control" the rest of\
// the UI objects on the view, you can make it a seperate class and connect\
// it to the delegate, so it knows when it will be swapped in and out.\
\
\b0 - delegate\
\{\
return delegate;\
\}\
\
- setDelegate: aDelegate\
\{\
delegate = aDelegate;\
return self;\
\}\
\
\
/*\
* These revert/ok msg are send to setup/save the contents of a view.\
* Only the revert msg is invoked by default. If you have to store some\
* data when swapping out implement a [self ok:self] msg iside willSwapOut.\
* Ok should be used to save the changes made and revert should init the\
* view to show the current settings.\
*/\
\
- ok:sender\
\{\
[self _dispatchToDelegate: @selector(ok:) with: sender];\
return self;\
\}\
\
- revert:sender\
\{\
[self _dispatchToDelegate: @selector(revert:) with: sender];\
return self;\
\}\
\
/*\
* These messages we will get from our swapView. ThatĀs how we can\
* recognize that maybe some things have to be written to the defaults\
* database or something has to be updated etc.\
* You should override them in you subclass.\
* They are no actionMethods because we always know who our swapCtrl. is.\
* So sender is not needed here.\
*/\
\
- willSwapIn\
\{\
[self revert:self];\
\b [self _dispatchToDelegate: @selector(willSwapViewIn:) with: self];
\b0 \
return self;\
\}\
\
- willSwapOut\
\{\
\b [self _dispatchToDelegate: @selector(willSwapViewOut:) with: self];
\b0 \
return self;\
\}\
\
- didSwapIn\
\{\
\b [self _dispatchToDelegate: @selector(didSwapViewIn:) with: self];
\b0 \
return self;\
\}\
\
- didSwapOut\
\{\
\b [self _dispatchToDelegate: @selector(didSwapViewOut:) with: self];
\b0 \
return self;\
\}\
\
\
\
- read: (NXTypedStream *)stream\
\{\
int version;\
\
[super read: stream];\
version = NXTypedStreamClassVersion(stream, MISC_SCC_CLASSNAME);\
\
switch (version)\
\{\
case 0:\
swapView = NXReadObject (stream);\
view = NXReadObject (stream);\
trigger = NXReadObject (stream);\
delegate = NXReadObject (stream);\
NXReadType (stream, "i", &triggerTag);\
break;\
default:\
break;\
\}\
\
return self;\
\}\
\
- write: (NXTypedStream *)stream\
\{\
[super write: stream];\
NXWriteObjectReference (stream, swapView);\
NXWriteObjectReference (stream, view);\
NXWriteObjectReference (stream, trigger);\
NXWriteObjectReference (stream, delegate);\
NXWriteType (stream, "i", &triggerTag);\
\
return self;\
\}\
\
@end\
\
\
@implementation MiscSwapContentsController (PrivateMethods)\
\
- _dispatchToDelegate: (SEL)message\
\{\
if (delegate && [delegate respondsTo: message])\
return [delegate perform: message];\
\
// No delegate or doesn't respond to message. \
return nil;\
\}\
\
\
\
- _dispatchToDelegate: (SEL)message with: anObject\
\{ \
if (delegate && [delegate respondsTo: message])\
return [delegate perform: message with: anObject];\
\
return nil;\
\}\
\
@end\
\
\
/*\
* History: 25.09.94 Added archiving (read:, write:, +initialize).\
* Added a delegate so this class could be on a palette\
* and would not require subclassing. Also took away\
* the awakeFromNib method since you can now register a\
* controller without having a trigger set.\
*\
* 14.02.94 Changed the classes name to MiscSwapContentsController\
* from the MiscSwapSubviewController becauses it fits better\
* to what it really is.\
*\
* 24.01.94 Made it a Misc object and changed it to work with the\
* new Misc stuff.\
*\
* 09.01.94 Added the ok/revert stuff.\
*\
* 08.01.94 Derived from my old swapViewdelegate. The code+methods\
* were cleaned up a bit.\
*\
*\
* Bugs: - no read/write;
\b (not anymore)
\b0 \
*\
* - Maybe I should do more responds to or class checking.. hmm ??\
*\
* - Not a bug but: I don't love the double registry made by awakeFromNib\
* and setSwapView. It works but it's not elegant.
\b (not anymore)
\b0 \
*/
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.