/* 
   GSNibTemplates.h

   Copyright (C) 1997, 1999 Free Software Foundation, Inc.

   Author:  Gregory John Casamento <greg_casamento@yahoo.com>
   Date: 2002
   
   This file is part of the GNUstep GUI Library.

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2 of the License, or (at your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with this library; see the file COPYING.LIB.
   If not, see <http://www.gnu.org/licenses/> or write to the 
   Free Software Foundation, 51 Franklin Street, Fifth Floor, 
   Boston, MA 02110-1301, USA.
*/ 

#ifndef _GNUstep_H_GSNibTemplates
#define _GNUstep_H_GSNibTemplates

#import <Foundation/NSObject.h>
#import "GNUstepGUI/GSNibContainer.h"


// version of the nib container and the templates.
#define GNUSTEP_NIB_VERSION 2
#define GSSWAPPER_VERSION   0
#define GSWINDOWT_VERSION   1
#define GSVIEWT_VERSION     0
#define GSCONTROLT_VERSION  0
#define GSTEXTT_VERSION     0
#define GSTEXTVIEWT_VERSION 0
#define GSMENUT_VERSION     0
#define GSOBJECTT_VERSION   0

@class NSString;
@class NSDictionary;
@class NSMutableDictionary;
@class NSMutableSet;
@class NSWindow;

/** Window template autopositioning constants */
enum {
  GSWindowAutoPositionNone = 0,
  GSWindowMinXMargin = 1,
  GSWindowMaxXMargin = 2,
  GSWindowMinYMargin = 4,
  GSWindowMaxYMargin = 8
};

/*
 * This is the class that holds objects within a nib.
 */
APPKIT_EXPORT_CLASS
@interface GSNibContainer : NSObject <NSCoding, GSNibContainer>
{
  NSMutableDictionary	*nameTable;
  NSMutableArray	*connections;
  NSMutableArray	*visibleWindows;
  NSMutableArray	*deferredWindows;
  NSMutableSet          *topLevelObjects;
  NSMutableDictionary	*customClasses;
  BOOL			isAwake;
}
- (NSMutableArray*) visibleWindows;
- (NSMutableArray*) deferredWindows;
- (NSMutableDictionary *) customClasses;
@end

/*
 * Template classes
 */
@protocol GSTemplate
- (id) initWithObject: (id)object className: (NSString *)className superClassName: (NSString *)superClassName;
- (void) setClassName: (NSString *)className;
- (NSString *)className;
@end

APPKIT_EXPORT_CLASS
@interface GSClassSwapper : NSObject <GSTemplate, NSCoding>
{
  id                   _object;
  NSString            *_className;
  Class                _superClass;
}
- (BOOL) shouldSwapClass;
@end

APPKIT_EXPORT_CLASS
@interface GSNibItem : NSObject <NSCoding> 
{
  NSString		*theClass;
  NSRect		theFrame;
  unsigned int          autoresizingMask;
}
@end

APPKIT_EXPORT_CLASS
@interface GSCustomView : GSNibItem <NSCoding>  
{
}
@end

APPKIT_EXPORT_CLASS
@interface GSWindowTemplate : GSClassSwapper
{
  BOOL                 _deferFlag;
  unsigned int         _autoPositionMask;
  NSRect               _screenRect;
}
// auto position the window.
- (unsigned int) autoPositionMask;
- (void) setAutoPositionMask: (unsigned int)flag;
- (void) autoPositionWindow: (NSWindow *)window;

// set attributes specific to the template.
- (void) setDeferFlag: (BOOL)flag;
- (BOOL) deferFlag;
@end

APPKIT_EXPORT_CLASS
@interface GSViewTemplate : GSClassSwapper
@end

APPKIT_EXPORT_CLASS
@interface GSTextTemplate : GSClassSwapper
@end

APPKIT_EXPORT_CLASS
@interface GSTextViewTemplate : GSClassSwapper 
@end

APPKIT_EXPORT_CLASS
@interface GSMenuTemplate : GSClassSwapper
@end

APPKIT_EXPORT_CLASS
@interface GSControlTemplate : GSClassSwapper
@end

APPKIT_EXPORT_CLASS
@interface GSObjectTemplate : GSClassSwapper
@end

APPKIT_EXPORT_CLASS
@interface GSTemplateFactory : NSObject
+ (id) templateForObject: (id) object 
	   withClassName: (NSString *)className
      withSuperClassName: (NSString *)superClassName;
@end
#endif /* _GNUstep_H_GSNibTemplates */
