/* BBMoleculeShape.m				 
 *
 * This object is the world of a molecule. It maintains a list of regions that
 * have to be drawn to paint the molecule. We use the molecules visibleRegions
 * and recommend certain methods to be available for every shape-provider.
 *
 * For more interface-info see the header file. More in depth information
 * can be found in the source-code.
 *
 * Written by: 		Thomas Engel
 * Created:    		22.12.1993 (Copyleft)
 * Last modified: 	17.05.1994
 */

#import "BBMoleculeShape.h"
#import "BBMolecule.h"
#import "BBRegionShape.h"

@implementation BBMoleculeShape

- initFrom:someRegions asPartOf:aMolecule;
{	
	self = [super init];
	if( !self ) return self;

	// OK. We really are an object...here we go with our init.
	
	ourRegions = [someRegions copy];
	ourMolecule = aMolecule;
	shapeList = [List new];
	[self update];
	
	return self;
}

- free
{
	[ourRegions free];
	[shapeList free];
	return [super free];
}

- renderSelf:(RtToken)context
{
	// We won't do anything here. We are only a collector of subshapes.
	// In this case they are regions.
	
	return self;
}

- update
{
	// With this method we will create a shapeList for the current molecule
	// and forget about the old one.
	
	id	aShape;
	int	i;
	
	descendant = nil;
	[shapeList freeObjects];
	
	for( i=0; i<[ourRegions count]; i++ )
	{
		// Now we will ask every visible group for its shape.
		// The shapeList will keep track of every object.
		// We have the right to free those objects!
		
		aShape = [[ourRegions objectAt:i] shape];
		[aShape group:self];
		[shapeList addObject:aShape];
	}

	return self;
}

- rotationStyleOn:(BOOL)aFlag
{
	// Here we will take every shape from the shapeList. Tell it to use
	// the regions draw/or rotation style and cause it to rearange its shapes.
	// No redraw is triggered!
	
	int	i;
	id	aShape;
	id	aRegion;
	
	for( i=0; i<[shapeList count]; i++ )
	{
		aShape = [shapeList objectAt:i];
		aRegion = [aShape region];
		
		if( aFlag == YES )
				[aShape setRenderingStyle:[aRegion rotationStyle]];
		else	[aShape setRenderingStyle:[aRegion drawingStyle]];
	}
//	[aShape update];		<< I should check that !!
	
	return self;
}

- molecule
{
	return ourMolecule;
}

- addRegion:aRegion
{
	if( [ourRegions indexOf:aRegion] == NX_NOT_IN_LIST )
	{
		[ourRegions addObject:aRegion];
		[self update];
	}
	return self;
}

@end

/*
 * History: 17.05.95 Added the molecule reference.
 *
 *			07.05.94 Changed the naming to BB...
 *
 *			15.01.94 Changed the MolShape to ask the molecule for ist 
 *					 visibleGroups and ask those visibleGroups for their
 *					 shapes.
 *
 *			25.12.93 Changed clas to include atomShapes/bondShapes.
 *
 *			22.12.93 First running version..display a simple molecule.
 *
 *
 * Notes: - shapeList. Maybe it is really useless because I am able to get all
 *			the shapes later too through the descendent etc methods of a 3D
 *			shape. But I will leave it for the moment because it serves the
 *		    purpose of esaily freeing all subshapes. So not that useless
 *		    (10.3.94)
 *
 *		  - I should make it a BBRegionShape subclass soon..or ?.
 *
 *
 * Bugs: - Using the update while adding another region might be somewhat
 *		   stupid but right now its easy and it works.
 */