This is SwapView.m in view mode; [Download] [Up]
/* * Author: Greg Burd, Mr. Average Developer * (I would like to be a member of the NeXT Developer Support Team.) * * You may freely copy, distribute and reuse the code in this example. * I disclaim any warranty of any kind, expressed or implied, as to * its fitness for any particular use. */ #import "SwapView.h" #import <appkit/Window.h> #import <appkit/Application.h> #import <dpsclient/psops.h> #import <dpsclient/wraps.h> #import <dpsclient/dpsNeXT.h> #import <appkit/graphics.h> #import <objc/List.h> /**************************************************************/ /* * Author: Greg Burd, Mr. Average Developer * (I would like to be a member of the NeXT Developer Support Team.) * * You may freely copy, distribute and reuse the code in this example. * I disclaim any warranty of any kind, expressed or implied, as to * its fitness for any particular use. * * * This contains a function that really needs to be in the * NX functions, so I named it as such. It should be used when * coding delegate functions. * * NXAskDelegate(id delegate, SEL delegateMethod); * * Simply put it makes sure that that the delegate object is not * nil and that it respondsTo: the selector delegateMethod. If it * does it calls the delegate with the selector and returns the result * otherwise it returns NULL. */ #import <objc/objc.h> extern void* NXAskDelegate(id delegate, SEL selector) { return (delegate && [delegate respondsTo:selector]); } /**************************************************************/ @implementation SwapView - init { NXRect theFrame = {{0.0, 0.0}, {0.0, 0.0}}; return [self initFrame:&theFrame]; } /* designated initilizer */ - initFrame:(NXRect *)theFrame { [super initFrame:theFrame]; lastInspector = NULL; currentInspector = NULL; backgroundGray = NX_LTGRAY; return self; } - currentInspector { return currentInspector; } - lastInspector { return lastInspector; } - delegate { return delegate; } - setDelegate:(id)anObject { delegate = anObject; return self; } - (float)backgroundGray { return backgroundGray; } - setBackgroundGray:(float)aGray { backgroundGray = aGray; return self; } /* WARNING!!!! * * Don't forget to make sure that the off screen windows are NOT deferred!!! * This means make sure that you turn the Deffered switch OFF in IB when * looking at the Atributes inspector. This allows offscreen drawing. If it * was on, then the gstate will be zero!!!! */ - swapIt:sender { [self swapIt]; return self; } /* this is the real function !! */ - swapIt { NXRect theFrame; int gstate; id aView, inspector; /* make sure the delegate impliments the whatPanel call */ if (!NXAskDelegate(delegate, @selector(whatPanel))){ //logError somewhere }; // call the delegate inspector = [delegate whatPanel]; /* make sure that it is a new view to swap in */ if(lastInspector != inspector) { if(lastInspector) { /* remove old inspector from view hierarchy */ aView = [lastInspector contentView]; [aView removeFromSuperview]; /* and put it back */ [lastInspector setContentView:aView]; } /* update the offscreen view */ [inspector display]; NXPing(); /* no inspector so clean up the background */ if(!inspector){ [self lockFocus]; /* use the backgroundGray */ PSsetgray(backgroundGray); NXRectFill(&bounds); [self unlockFocus]; /* now the last inspector is NULL */ lastInspector = NULL; /* let the window server cetch up... (yawn...) */ NXPing(); } /* put in the new inspector */ gstate = [inspector gState]; if (gstate) { /* get the frame to composite in */ [[inspector contentView] getFrame:&theFrame]; [self lockFocus]; /* blast the bits over to the view we locked focus on (ie. SwapView) */ PScomposite((float)theFrame.origin.x, (float)theFrame.origin.y, (float)theFrame.size.width, (float)theFrame.size.height, (int)gstate, (float)1.0, (float)1.0, (int)NX_COPY); [self unlockFocus]; /* now add the subview to the SwapView for the responder chain... */ [self addSubview:[inspector contentView]]; /* and remember the panel it came from */ lastInspector = inspector; } /* see whats up out there */ [[self window] flushWindow]; } return self; } - free { return [super free]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.