/*
 *  This Application subclass provides support for NSAutoreleasePools.
 *  If you have an application that uses Foundation but not EOF you
 *  need to make this class your Application class, otherwise your
 *  application will have a lot of serious memory leaks.
 *
 *  No guarantee is made for the fitness of this code for any particular
 *  use.  No warranty expressed or implied.  Use at your own risk!
 *
 *  Randy Tidd
 *  NeXT Premium Developer Support
 */
#import "PoolApplication.h"

@implementation PoolApplication : Application

- init
{
    /*
     *  If Application can't init, there must be some problem so we
     *  return nil.
     */
    if( (self = [super init]) == nil) {
        return nil;
    } 

    /*
     *  Create the first pool, this will be released before the first event.
     */
    autoreleasePool = [[NSAutoreleasePool alloc] init];
    disableCount = 0;

    return self;
}

/*
 *  Release the current pool, and create a new one.
 */
- (void)_releasePool
{
	if(disableCount<= 0) {
		[autoreleasePool release];
		autoreleasePool = [[NSAutoreleasePool alloc] init];
	}
}

/*
 *  Release the current pool before and after every event.
 */
- sendEvent:(NXEvent *)event
{
	[self _releasePool];

	[super sendEvent:event];

	[self _releasePool];

	return self;
}

/*
 *  Need to disable the autorelease pool during modal loops otherwise
 *  objects that are involved in the modal loop will be freed prematurely.
 *  We need to have a "disable count" rather than a boolean flag because
 *  we can have nested modal sessions.
 */
- (int)runModalSession:(NXModalSession *)session
{
	int retVal;

	disableCount++;
	retVal = [super runModalSession:session];
	disableCount--;

	return retVal;
}

- (int)runModalFor:theWindow
{
	int retVal;

	disableCount++;
	retVal = [super runModalFor:theWindow];
	disableCount--;

	return retVal;
}


@end
