//
//  FileSettings.h
//  PythonLauncher
//
//  Created by Jack Jansen on Sun Jul 21 2002.
//  Copyright (c) 2002 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol FileSettingsSource
- (NSString *) interpreter;
- (BOOL) honourhashbang;
- (BOOL) debug;
- (BOOL) verbose;
- (BOOL) inspect;
- (BOOL) optimize;
- (BOOL) nosite;
- (BOOL) tabs;
- (NSString *) others;
- (BOOL) with_terminal;
- (NSString *) scriptargs;
@end

@interface FileSettings : NSObject <FileSettingsSource>
{
    NSString *interpreter;      // The pathname of the interpreter to use
    NSArray *interpreters;      // List of known interpreters
    BOOL honourhashbang;        // #! line overrides interpreter
    BOOL debug;                 // -d option: debug parser
    BOOL verbose;               // -v option: verbose import
    BOOL inspect;               // -i option: interactive mode after script
    BOOL optimize;              // -O option: optimize bytecode
    BOOL nosite;                // -S option: don't import site.py
    BOOL tabs;                  // -t option: warn about inconsistent tabs
    NSString *others;           // other options
    NSString *scriptargs;       // script arguments (not for preferences)
    BOOL with_terminal;         // Run in terminal window

    FileSettings *origsource;
    NSString *prefskey;
}

+ (id)getDefaultsForFileType: (NSString *)filetype;
+ (id)getFactorySettingsForFileType: (NSString *)filetype;
+ (id)newSettingsForFileType: (NSString *)filetype;

- (id)initForFileType: (NSString *)filetype;
- (id)initForFSDefaultFileType: (NSString *)filetype;
- (id)initForDefaultFileType: (NSString *)filetype;

- (void)updateFromSource: (id <FileSettingsSource>)source;
- (NSString *)commandLineForScript: (NSString *)script;

- (void)applyValuesFromDict: (NSDictionary *)dict;
- (void)reset;
- (NSArray *) interpreters;

@end
