This is SwapView.m in view mode; [Download] [Up]
//*****************************************************************************
//
// SwapView.m.
//
// I have condensed, optimized and reformatted the code so that a swapview
// can be implemented with this source file and a nib. Added initPopUp
// method.
//
// changes 5/25/95 by Felipe A. Rodriguez
// changes 7/29/95 by Felipe A. Rodriguez
// -- replaced addSubview in SwapIt method with replaceSubview. This
// corrected a bug where textfields remained active after swap
// changes 3/14/96 by Felipe A. Rodriguez
// -- optimized class to support more inspectors
// changes 8/1/97 by Felipe A. Rodriguez
// -- added support for dynamically loaded inspectors
// changes 12/11/97 by Felipe A. Rodriguez
// -- modified support for dynamically loaded inspectors
//
// This file was derived from:
//
// SwapView.m and InspectorController.m
// by Greg Burd
// SwapItDemo, ver 2.0
//
// This code is supplied "as is" the author's makes no warranty as to its
// suitability for any purpose. This code is free and may be distributed
// in accordance with the terms of the:
//
// GNU GENERAL PUBLIC LICENSE
// Version 2, June 1991
// copyright (C) 1989, 1991 Free Software Foundation, Inc.
// 675 Mass Ave, Cambridge, MA 02139, USA
//
//*****************************************************************************
#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>
#import <objc/objc.h>
#import <appkit/PopUpList.h>
#import <apps/InterfaceBuilder.h>
@implementation SwapView
//*****************************************************************************
//
// attach popup to popUpList
//
// popUpCover must be attached to the trigger button of a popUpList in IB
//
//*****************************************************************************
- initPopUp
{
if(popUpCover) // if popUpCover s/b hooked to a trigger button in IB
popup = [popUpCover target]; // popup should point to its popUpList
return self;
}
//*****************************************************************************
//
// designated initilizer for swapviews
//
//*****************************************************************************
- initFrame:(const NXRect *)theFrame
{
char title[] = {"FirstInspector"};
[super initFrame:theFrame];
lastInspector = NULL;
currentInspector = NULL;
backgroundGray = NX_LTGRAY;
theTitle = title;
[self setBackgroundGray:NX_LTGRAY]; // default
inspectorHashTable = [[HashTable alloc] initKeyDesc:"@" valueDesc:"@"];
return self;
}
//*****************************************************************************
//
// swaps views in and out of inspector's swapview
//
//*****************************************************************************
- swapIt
{
if(lastInspector != inspector) // make sure this is a new view to swap in
{
if(!inspector) // no inspector so clean up the background
{
[self lockFocus];
PSsetgray(backgroundGray); // use the backgroundGray
NXRectFill(&bounds);
[self unlockFocus];
lastInspector = NULL; // now the last inspector is NULL
NXPing(); // let the window server cetch up... (yawn...)
}
// add the subview to SwapView and its responder chain
if(lastInspector)
[self replaceSubview:[lastInspector contentView]
with:[inspector contentView]];
else
[self addSubview:[inspector contentView]];
[self display];
lastInspector = inspector; // remember the panel it came from
}
return self;
}
//*****************************************************************************
//
// add an inspector for a sender of class matrix
//
//*****************************************************************************
- addInspector:anInspector for:sender
{
[inspectorHashTable insertKey:[sender selectedCell] value:anInspector];
return self;
}
//*****************************************************************************
//
// this is to allow us to jump to any inspector given its key name
//
//*****************************************************************************
- inspectorFor:sender
{
inspector = [inspectorHashTable valueForKey:[sender selectedCell]];
[self swapIt];
return self;
}
//*****************************************************************************
//
// target of pop up list button
//
//*****************************************************************************
- popUpAction:sender
{
// set up a pointer to the selectedCell of the matrix
theTitle = [[sender selectedCell] title];
[self swapIt]; // swap out the view
return self;
}
- currentInspector
{
return currentInspector;
}
- lastInspector
{
return lastInspector;
}
- (float)backgroundGray
{
return backgroundGray;
}
- setBackgroundGray:(float)aGray
{
backgroundGray = aGray;
return self;
}
- free
{
return [super free];
}
//*****************************************************************************
//
// This should return the id of a panel, which is off screen, and
// buffered, but not defered (SwapView needs its gstate). SwapView will
// take the contentView of the panel and swap it in while also removing
// the old view, if any, and placing it back into its old panel.
//
// 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!!!!
//
// Ideally:: these panels should all be nibs so they have controllers
// and the above code should load the nib section if it
// already isn't loaded. It should load here because you only
// want to take up memory when it is demanded.
//
//*****************************************************************************
- whatPanel
{
switch(index) // find out what panel to give to the SwapView
{
case 0:
inspector = firstInspectorPanel;
break;
case 1:
inspector = secondInspectorPanel;
break;
default: // the button title has no related inspector,
inspector = nil; // this should never happen.
break;
}
return inspector;
}
//*****************************************************************************
//
// this is to allow us to jump to any inspector given its index
//
//*****************************************************************************
- inspect:(int)anIndex
{
index = anIndex;
[self whatPanel];
[self swapIt];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.