/* BBFileFilterManager.m				 
 *
 * This FilterManager is resposible for the conversion of the different
 * molFileFormats (ways of storing molData) into useful objects.
 * The real work (read/write) is done by single filters that are known here.
 *
 * For interface-info see the header file. The comments in this file mostly
 * cover only the real implementation details.
 *
 * Written by: 		Thomas Engel
 * Created:    		15.11.1993 (Copyleft)
 * Last modified: 	30.10.1994
 */

#import "BBFileFilterManager.h"
#import "BBLook3DFilter.h"
#import "BBPdbFilter.h"
#import "BBAlchemyFilter.h"
#import "BBMvtxFilter.h"
#import "BBMacMoleculeFilter.h"

@implementation BBFileFilterManager

- init
{
	self = [super init];
	if( !self ) return self;

	// Looks good. A are for real. Lets do the init.
	
	filterList = [List new];
	[self addFilter:[BBLook3DFilter new]];
	[self addFilter:[BBPdbFilter new]];
	[self addFilter:[BBAlchemyFilter new]];
	[self addFilter:[BBMvtxFilter new]];
	[self addFilter:[BBMacMoleculeFilter new]];
	
	return self;
}

- free
{
	[[filterList freeObjects] free];
	return self;
}

- readBeaker:aBeaker fromFile:(const char *)filename
{
	// Here we try to find the best filter available for this file.
	// If there is one that handles all the details we will pass this request
	// along. If there are more or the only available filter does not handle
	// all the details of the file we will inform him.
	
	id		theFilter;
	float	bestGrade;
	float	aGrade;
	int	i;
	
	theFilter = nil;
	bestGrade = 0;
	
	for( i=0; i<[filterList count]; i++ )
	{
		aGrade = [[filterList objectAt:i] canReadFile:filename];
		if( aGrade > bestGrade )
		{
			bestGrade = aGrade;
			theFilter = [filterList objectAt:i];
		}
	}
	
	if( theFilter == nil )
			NXRunAlertPanel( NULL, 
							 "There is no filter for this data in the "\
							 "current release", 
							 "Sorry", NULL, NULL );

	else	[theFilter readBeaker:aBeaker fromFile:filename];
	
	return self;
}

- addFilter:aFilter
{
	[filterList addObject:aFilter];
	return self;
}

- removeFilter:aFilter
{
	return self;
}

@end

/*
 * History: 30.10.94 Switched to the MiscString.
 *
 *			15.03.94 Added MvtxFilter and AlchemyFilter.
 *
 *			14.03.94 Made it a real manager. It now will handle different
 *					 filetypes.
 *
 *			14.01.94 Made the parsing somewhat nicer and cleaner.
 *
 *			13.01.94 Did completely rewrite the parsing section. Now uses
 *					 MOStrings to parse self.
 *
 *			28.12.93 Created a initBeaker method.
 *
 *
 * Notes: - Once we have some more filters that can only MAYBE handle a
 *			file we will have to bring up a panel that lets the user choose
 *			the filter he wants.
 *
 *
 * Bugs: - No removal of filters.
 *
 *		 - Because this object might someday be used by different beakers at
 *		   the same time I should add some locking or what ever. Right
 *		   this is no problem at all.

 */