Move Mac/OSX/PythonLauncher one level up
diff --git a/Mac/PythonLauncher/PreferencesWindowController.m b/Mac/PythonLauncher/PreferencesWindowController.m
new file mode 100644
index 0000000..311c375
--- /dev/null
+++ b/Mac/PythonLauncher/PreferencesWindowController.m
@@ -0,0 +1,121 @@
+#import "PreferencesWindowController.h"
+
+@implementation PreferencesWindowController
+
++ getPreferencesWindow
+{
+    static PreferencesWindowController *_singleton;
+    
+    if (!_singleton)
+        _singleton = [[PreferencesWindowController alloc] init];
+    [_singleton showWindow: _singleton];
+    return _singleton;
+}
+
+- (id) init
+{
+    self = [self initWithWindowNibName: @"PreferenceWindow"];
+    return self;
+}
+
+- (void)load_defaults
+{
+    NSString *title = [filetype titleOfSelectedItem];
+    
+    settings = [FileSettings getDefaultsForFileType: title];
+}
+
+- (void)update_display
+{
+//    [[self window] setTitle: script];
+    
+	[interpreter reloadData];
+    [interpreter setStringValue: [settings interpreter]];
+    [honourhashbang setState: [settings honourhashbang]];
+    [debug setState: [settings debug]];
+    [verbose setState: [settings verbose]];
+    [inspect setState: [settings inspect]];
+    [optimize setState: [settings optimize]];
+    [nosite setState: [settings nosite]];
+    [tabs setState: [settings tabs]];
+    [others setStringValue: [settings others]];
+    [with_terminal setState: [settings with_terminal]];
+    // Not scriptargs, it isn't for preferences
+    
+    [commandline setStringValue: [settings commandLineForScript: @"<your script here>"]];
+}
+
+- (void) windowDidLoad
+{
+    [super windowDidLoad];
+    [self load_defaults];
+    [self update_display];
+}
+
+- (void)update_settings
+{
+    [settings updateFromSource: self];
+}
+
+- (IBAction)do_filetype:(id)sender
+{
+    [self load_defaults];
+    [self update_display];
+}
+
+- (IBAction)do_reset:(id)sender
+{
+    [settings reset];
+    [self update_display];
+}
+
+- (IBAction)do_apply:(id)sender
+{
+    [self update_settings];
+    [self update_display];
+}
+
+// FileSettingsSource protocol 
+- (NSString *) interpreter { return [interpreter stringValue];};
+- (BOOL) honourhashbang { return [honourhashbang state]; };
+- (BOOL) debug { return [debug state];};
+- (BOOL) verbose { return [verbose state];};
+- (BOOL) inspect { return [inspect state];};
+- (BOOL) optimize { return [optimize state];};
+- (BOOL) nosite { return [nosite state];};
+- (BOOL) tabs { return [tabs state];};
+- (NSString *) others { return [others stringValue];};
+- (BOOL) with_terminal { return [with_terminal state];};
+- (NSString *) scriptargs { return @"";};
+
+// Delegates
+- (void)controlTextDidChange:(NSNotification *)aNotification
+{
+    [self update_settings];
+    [self update_display];
+};
+
+// NSComboBoxDataSource protocol
+- (unsigned int)comboBox:(NSComboBox *)aComboBox indexOfItemWithStringValue:(NSString *)aString
+{
+	NSArray *interp_list = [settings interpreters];
+    unsigned int rv = [interp_list indexOfObjectIdenticalTo: aString];
+	return rv;
+}
+
+- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(int)index
+{
+	NSArray *interp_list = [settings interpreters];
+    id rv = [interp_list objectAtIndex: index];
+	return rv;
+}
+
+- (int)numberOfItemsInComboBox:(NSComboBox *)aComboBox
+{
+	NSArray *interp_list = [settings interpreters];
+    int rv = [interp_list count];
+	return rv;
+}
+
+
+@end