{\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 \
 */
}
