This is BBCameraWindow.m in view mode; [Download] [Up]
/* BBCameraWindow.m * * Represents a particular View of a Beaker. Here we control the beakerCamera * and relating controls and settings. * * For interface-info see the header file. The comments in this file mostly * cover only the real implementation details. * * Written by: Thomas Engel * Created: 22.10.1993 (Copyleft) * Last modified: 30.10.1994 */ #import "BBCameraWindow.h" #import "BBBeakerCamera.h" #import "BBBeaker.h" #import "BBMolecule.h" #import "BBMoleculeShape.h" #import <misckit/MiscString.h> @implementation BBCameraWindow - initFrom:aList asPartOf:aBeaker { id ourList; id nameobj; id ambientLight; id pointLight; RtPoint fromPoint; RtPoint toPoint; self = [super init]; if( !self ) return self; // All right we are a real object now and should load the NIB. // Inside the NIB we are declared to be the windows delegate. if( [NXApp loadNibSection:"CameraWindow.nib" owner:self] == nil ) NXRunAlertPanel( NULL, "Couldn't load CameraWindow.nib", "OK", NULL, NULL ); ourBeaker = aBeaker; // Now lets get our Outfit right. Some naming has to be done here. nameobj = [MiscString new]; [nameobj setIntValue:[[ourBeaker cameraList] count] + 1]; [nameobj preCatStringValue:"Camera #"]; [[[nameobj catStringValue:" ("] catStringValue:[ourBeaker name]] catStringValue:")"]; [self setName:[nameobj stringValue]]; [self setImage:[NXImage findImageNamed:"CameraIcon"]]; // We have to create the simple world before we make the window front // After that we can add us to the beakers camera list (this is not // perfect..see bugs) [camera createWorldFor:ourBeaker]; [window setTitle:[self name]]; [window setMiniwindowImage:[self image]]; [window makeKeyAndOrderFront:self]; [ourBeaker addCamera:self]; // The window is ready. Now we will add all the shapes to our // camera. This might be some recursive process. ourList = [aList copy]; [self addShapesFrom:ourList]; // Lights will be created here too. The default is a ambient an // a point light. ambientLight = [N3DLight new]; [ambientLight makeAmbientWithIntensity:0.5]; [camera addLight:ambientLight]; fromPoint[0] = -60.0; fromPoint[1] = 60.0; fromPoint[2] = -60.0; toPoint[0] = 0.0; toPoint[1] = 0.0; toPoint[2] = 0.0; pointLight = [N3DLight new]; [pointLight makeDistantFrom:fromPoint to:toPoint intensity:1.0]; [camera addLight:pointLight]; // Now we only have to redraw the camera area and add the lights to // our hirarchie. [camera display]; //[(List *)self addObject:ourList]; // [self addObject:ambientLight]; // [self addObject:pointLight]; [ourList free]; return self; } - addShapesFrom:anObject { // Only the objects that know how to produce a shape will be added. // Lists are treated seperatly. // ATTENTION: I won't use recuresive calls right now, because this might // lead to chaos. // Every region has to be group to its molecule if it already does exist.! // If not we have to create a molecule shape first. int i; id aList; // If an object understands "regions" and "molecule" it should be a group // of regions. The rest is just adding single regions. if( [anObject respondsTo:@selector(regions)] && [anObject respondsTo:@selector(molecule)]) { aList = [anObject regions]; for( i=0; i<[aList count]; i++ ) [self addShapeOf:[aList objectAt:i]]; } // If it is a simple list we will try to do the same with all the // single elements of the list. else if( [anObject respondsTo:@selector(count)] && [anObject respondsTo:@selector(objectAt:)] ) { for( i=0; i<[anObject count]; i++ ) [self addShapeOf:[anObject objectAt:i]]; } // The final step is to try adding the object on its own. else [self addShapeOf:anObject]; return self; } - addShapeOf:oneObject { // This does add a single object to the view hirarchy. // Used only internally! // Adding is only possible if the object knows about its shape. // If it gets added to a molecule or not depends on the object. Does it // know it molecule ? Sometimes we might have to create the molecule first. id molShape; id aList; if( [oneObject respondsTo:@selector(shape)] ) { // If the object knows its molecule it should be a region. So we // might add it to the molecules shape. // If its class is the molecule shape it is a molecule and we will // only add it if it is not already visible. if( [oneObject respondsTo:@selector(molecule)] ) { molShape = [self findShapeFor:[oneObject molecule]]; if( [oneObject shapeClass] == [BBMoleculeShape class] ) { if( !molShape ) [camera addShape:[oneObject shape]]; } else { if( !molShape ) { aList = [List new]; molShape = [[[[oneObject molecule] shapeClass] alloc] initFrom:aList asPartOf:[oneObject molecule]]; [aList free]; [camera addShape:molShape]; } [molShape addRegion:oneObject]; } } // otherwise we will just add it to the world. Who knows what it is. else [camera addShape:[oneObject shape]]; } return self; } - findShapeFor:anObject { // Currently we are only using this method to find a molecule shape // for a certain molecule. // This method may be extended or move to some other object (beakerShape) id aShape; aShape = [[camera worldShape] descendant]; while( aShape != nil ) { if( [aShape respondsTo:@selector(molecule)] ) { if( [aShape molecule] == anObject ) return aShape; } aShape = [aShape nextPeer]; } // Not found..sorry return nil; } - print:sender { // Some print defaults... [[[NXApp printInfo] setVertCentered:YES] setOrientation:NX_PORTRAIT andAdjust:YES]; [[NXApp printInfo] setMarginLeft:0.0 right:0.0 top:0.0 bottom:0.0]; [[NXApp printInfo] setHorizPagination:NX_FITPAGINATION]; [[NXApp printInfo] setVertPagination:NX_FITPAGINATION]; [camera printPSCode:self]; return self; } - close:sender { // This might appear when the whole Beaker document has to get closed. return [ourBeaker close:self]; } - closeWindow { [window close]; return self; } - window { return window; } - camera { return camera; } - windowDidBecomeMain:sender { // Once we become the main window we should inform the rotator where his // action should got. [[[NXApp delegate] rotator] setTarget:[camera worldShape]]; [[[NXApp delegate] rotator] setCamera:camera]; return self; } @end /* * History: 30.10.94 Switched to the MiscString. * * 17.05.94 Added automatic shape creation and printing method. * * 14.05.94 New name, and new code. * * 21.01.94 Added closeing the window. * * 10.01.94 Changed some methods to work properly with our * new objectWell. * * 28.12.93 Added the obj-image stuff and some general miniwindow * and camera support. But there is still more to come. * * 22.12.93 First coding has begun. * * * Bugs: - Well adding the camera to the beaker when inited is not perfect. * Maybe it is better to add it when it gets created. I should check * that...inside BBBrowserManager. * * - Adding the shapes is a big BUG! Right now I really don't like it. * But it should work for a while. */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.