This is BBBeaker.m in view mode; [Download] [Up]
/* BBBeaker.m
*
* This object controls the data of a beaker (molecules, cameras, groups etc.)
* It is the main document of BeakerBoy and controls everything from loading to
* setting up the browser which does most of the other work.
*
* For interface-info see the header file. The comments in this file mostly
* cover only the real implementation details.
*
* Written by: Thomas Engel
* Created: 23.10.1993 (Copyleft)
* Last modified: 12.11.1994
*/
#define CURRENT_VERSION 1
#import "BBBeaker.h"
#import "BBMolecule.h"
#import "BBAtom.h"
#import "BBBond.h"
#import "BBCameraWindow.h"
#import "BBAppManager.h"
#import "FileManager.subproj/BBFileFilterManager.h"
#import "Inspector.subproj/BBMasterInspector.h"
#import <misckit/MiscString.h>
#import <iconkit/IKBrowser.h>
#import "BBBrowserManager.h"
@implementation BBBeaker
+ initialize
{
if ( self == [BBBeaker class] )
[BBBeaker setVersion:CURRENT_VERSION];
return self;
}
- init
{
return [self initFromFile:""];
}
- initFromFile:(const char *)fileName
{
id nameobj;
self = [super init];
if( !self ) return self;
// OK. We really are an object...here we go with our init.
// Lets load the NIB. It has set our beaker to be its window-delegate.
// Without a NIB there will be no beaker object !
if( [NXApp loadNibSection:"Beaker.nib" owner:self] == nil )
{
NXRunAlertPanel( NULL, "Couldn't load Beaker.nib", "OK", NULL, NULL );
return nil;
}
// Lets setup the names.
filename = [[MiscString new] setPath:fileName];
nameobj = [filename fileBasename];
[self setName:[nameobj stringValue]];
[self setImage:[NXImage findImageNamed:"BeakerIcon"]];
[nameobj free];
// The next is to init all the lists we need. They are all IKSuitcases
// because we want them to easily browse and drag or what ever.
moleculeList = [BBSuitcase new];
[moleculeList setName:"Molecules"];
[moleculeList setImage:[NXImage findImageNamed:"MoleculeListIcon"]];
cameraList = [BBSuitcase new];
[cameraList setName:"Cameras"];
[cameraList setImage:[NXImage findImageNamed:"CameraListIcon"]];
[self addObject:moleculeList];
[self addObject:cameraList];
// OK the basic init seems to have passed with no problems. So now
// its time to let the data in. This done using the fileFormatManager.
// He can find the right parser for our file.
[[[NXApp delegate] fileManager] readBeaker:self fromFile:[self filename]];
// The browser should use our MatrixClass to give us the possibility to
// keep track of the object hierarchy.
// Plus some inits for the methods we want to get if something happens.
[browserManager initBrowser:browser root:self];
// Now there are some window settings to be done.
[window setMiniwindowImage:[self image]];
[window setTitleAsFilename:[self filename]];
// ok now we are a new document so lets become active.
[window makeKeyAndOrderFront:self];
return self;
}
- free
{
// We do not free all the NIB objects...hmm should check that out.
[[cameraList freeObjects] free];
[[moleculeList freeObjects] free];
[filename free];
return [super free];
}
- setName:(const char *)aString
{
id dir;
id newName;
id nameobj;
char sepChar[2];
[super setName:aString];
nameobj = [MiscString new];
[nameobj setStringValue:aString];
dir = [(MiscString *)filename directory];
sepChar[0] = [filename extensionSeparator];
sepChar[1] = 0;
newName = [filename fileExtension];
[newName preCatStringValue:sepChar];
[newName preCat:nameobj];
[filename setDirectory:[dir stringValue] file:[newName stringValue]];
// We need to free the unnecessary strings and set the new window title
[dir free];
[newName free];
[nameobj free];
[window setTitleAsFilename:[self filename]];
return self;
}
- (const char *)filename
{
return [filename stringValue];
}
- addMolecule:aMolecule
{
[aMolecule setBeaker:self];
[moleculeList addObject:aMolecule];
return self;
}
- removeMolecule:aMolecule
{
return self;
}
- emptyMoleculeList
{
return self;
}
- moleculeList
{
return moleculeList;
}
- addCamera:aCamera
{
[cameraList addObjectIfAbsent:aCamera];
return self;
}
- removeCamera:aCamera
{
return self;
}
- emptyCameraList
{
return self;
}
- cameraList
{
return cameraList;
}
/*
* Here come the methods we will implement to satisfy our window.
* They are useful to change the inspector and handle oher tasks.
*/
- close:sender
{
// If we really have to/can close this document
// we should close our cameras first...
[cameraList makeObjectsPerform:@selector(closeWindow)];
return self;
}
/*
* Archiving the whole Beaker...
*/
- read:(NXTypedStream *)stream
{
int version;
[super read:stream];
version = NXTypedStreamClassVersion( stream, "BBBeaker" );
// Version 1
if ( version == CURRENT_VERSION )
{
NXReadTypes( stream, "@", &moleculeList );
NXReadTypes( stream, "@", &cameraList );
}
else
NXRunAlertPanel( NULL, "Unknown version of the BBBeaker class.\n"\
"Maybe you should get a new release of BeakerBoy",
"Ooops", NULL, NULL );
return self;
}
- write:(NXTypedStream *)stream
{
[super write:stream];
// Version 1:
// Filename and all the browser stuff is not archived! Those infos are
// created at launch time.
NXWriteTypes( stream, "@", &moleculeList );
NXWriteTypes( stream, "@", &cameraList );
return self;
}
@end
/*
* History: 12.11.94 Added archiving and versioning.
*
* 30.10.94 Switched to the MiscString.
*
* 17.05.94 AddCamera uses addObjectIfAbsent: to avoid multiple
* camera add. Cameras always add themselfes when they get
* initialized.
*
* 14.05.94 Small fixes to get it running..
*
* 02.05.94 We are draggable now. and a BBBeaker!
*
* 10.01.94 Made it conform to my new ObjectWell and adjusted the icon
* method.
*
* 03.01.94 Added initFromFile and many other useful methods
*
* 28.12.93 Multiple cameraWindows have arrived today.
*
* 18.12.93 Some code for inspector-testing added. Will be removed
* soon. Not mentiones in the header-file.
*
* 25.11.93 Added the FileManager to provide the first beaker.
*
* 23.10.93 Just got it working to get some feeling for the app.
*
*
* Bugs: - Maybe we will have to ad a [self windowDidBecomeMain:self]
* inside the init if we include some appControlling action.
*
* - The initFromFile should add a check when lists could not be
* allocated. Ok we have a unix system so this should not be a problem
* because we do not have limited memory.
*/These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.