nkeynes@725: /** nkeynes@729: * $Id$ nkeynes@725: * nkeynes@725: * Construct and manage the preferences panel under cocoa. nkeynes@725: * nkeynes@725: * Copyright (c) 2008 Nathan Keynes. nkeynes@725: * nkeynes@725: * This program is free software; you can redistribute it and/or modify nkeynes@725: * it under the terms of the GNU General Public License as published by nkeynes@725: * the Free Software Foundation; either version 2 of the License, or nkeynes@725: * (at your option) any later version. nkeynes@725: * nkeynes@725: * This program is distributed in the hope that it will be useful, nkeynes@725: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@725: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@725: * GNU General Public License for more details. nkeynes@725: */ nkeynes@725: nkeynes@725: #include "cocoaui/cocoaui.h" nkeynes@725: #include "lxdream.h" nkeynes@725: #include "config.h" nkeynes@725: nkeynes@765: static LxdreamPrefsPanel *prefs_panel = NULL; nkeynes@765: nkeynes@765: @implementation LxdreamPrefsPane nkeynes@765: - (int)contentHeight nkeynes@765: { nkeynes@765: return [self frame].size.height - headerHeight; nkeynes@765: } nkeynes@765: nkeynes@765: - (id)initWithFrame: (NSRect)frameRect title:(NSString *)title nkeynes@765: { nkeynes@765: if( [super initWithFrame: frameRect ] == nil ) { nkeynes@765: return nil; nkeynes@765: } else { nkeynes@765: int height = frameRect.size.height - TEXT_GAP; nkeynes@765: nkeynes@765: NSFont *titleFont = [NSFont fontWithName: @"Helvetica-Bold" size: 16.0]; nkeynes@765: NSRect fontRect = [titleFont boundingRectForFont]; nkeynes@765: int titleHeight = fontRect.size.height + [titleFont descender]; nkeynes@770: NSTextField *label = cocoa_gui_add_label(self, title, nkeynes@765: NSMakeRect( TEXT_GAP, height-titleHeight, nkeynes@770: frameRect.size.width - (TEXT_GAP*2), titleHeight )); nkeynes@765: [label setFont: titleFont]; nkeynes@765: height -= (titleHeight + TEXT_GAP); nkeynes@765: nkeynes@765: NSBox *rule = [[NSBox alloc] initWithFrame: NSMakeRect(1, height, frameRect.size.width-2, 1)]; nkeynes@765: [rule setAutoresizingMask: (NSViewMinYMargin|NSViewWidthSizable)]; nkeynes@765: [rule setBoxType: NSBoxSeparator]; nkeynes@765: [self addSubview: rule]; nkeynes@765: height -= TEXT_GAP; nkeynes@765: nkeynes@765: headerHeight = frameRect.size.height - height; nkeynes@765: return self; nkeynes@765: } nkeynes@765: } nkeynes@725: @end nkeynes@725: nkeynes@770: /**************************** Main preferences window ************************/ nkeynes@765: nkeynes@765: @interface LxdreamPrefsPanel (Private) nkeynes@765: - (void) initToolbar; nkeynes@765: - (NSToolbarItem *) createToolbarItem: (NSString *)id label: (NSString *) label nkeynes@765: tooltip: (NSString *)tooltip icon: (NSString *)icon action: (SEL) action; nkeynes@765: @end nkeynes@765: nkeynes@765: @implementation LxdreamPrefsPanel nkeynes@765: nkeynes@765: - (NSView *)createControlsPane nkeynes@725: { nkeynes@765: NSView *pane = [[NSView alloc] initWithFrame: NSMakeRect(0,0,600,400)]; nkeynes@765: return pane; nkeynes@765: } nkeynes@765: nkeynes@765: - (id)initWithContentRect:(NSRect)contentRect nkeynes@765: { nkeynes@765: if( [super initWithContentRect: contentRect nkeynes@765: styleMask: ( NSTitledWindowMask | NSClosableWindowMask | nkeynes@765: NSMiniaturizableWindowMask | NSResizableWindowMask | nkeynes@765: NSUnifiedTitleAndToolbarWindowMask ) nkeynes@765: backing: NSBackingStoreBuffered defer: NO ] == nil ) { nkeynes@765: return nil; nkeynes@765: } else { nkeynes@765: [self setTitle: NS_("Preferences")]; nkeynes@765: [self setDelegate: self]; nkeynes@770: [self setMinSize: NSMakeSize(400,300)]; nkeynes@765: [self initToolbar]; nkeynes@770: path_pane = cocoa_gui_create_prefs_path_pane(); nkeynes@770: ctrl_pane = cocoa_gui_create_prefs_controller_pane(); nkeynes@770: binding_editor = nil; nkeynes@765: [self setContentView: path_pane]; nkeynes@765: return self; nkeynes@765: } nkeynes@765: } nkeynes@770: - (void)dealloc nkeynes@770: { nkeynes@770: if( binding_editor != nil ) { nkeynes@770: [binding_editor release]; nkeynes@770: binding_editor = nil; nkeynes@770: } nkeynes@770: [super dealloc]; nkeynes@770: } nkeynes@765: - (void)windowWillClose: (NSNotification *)notice nkeynes@765: { nkeynes@765: prefs_panel = NULL; nkeynes@765: } nkeynes@770: - (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)view nkeynes@770: { nkeynes@770: if( [view isKindOfClass: [KeyBindingField class]] ) { nkeynes@770: if( binding_editor == nil ) { nkeynes@770: binding_editor = [[[KeyBindingEditor alloc] init] retain]; nkeynes@770: } nkeynes@770: return binding_editor; nkeynes@770: } nkeynes@770: return nil; nkeynes@770: } nkeynes@765: - (void) initToolbar nkeynes@765: { nkeynes@765: NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier: @"LxdreamPrefsToolbar"]; nkeynes@765: nkeynes@725: NSToolbarItem *paths = [self createToolbarItem: @"Paths" label: @"Paths" nkeynes@725: tooltip: @"Configure system paths" icon: @"tb-paths" nkeynes@725: action: @selector(paths_action:)]; nkeynes@725: NSToolbarItem *ctrls = [self createToolbarItem: @"Controllers" label: @"Controllers" nkeynes@725: tooltip: @"Configure controllers" icon: @"tb-ctrls" nkeynes@725: action: @selector(controllers_action:)]; nkeynes@765: toolbar_ids = [NSArray arrayWithObjects: @"Paths", @"Controllers", nil ]; nkeynes@765: toolbar_defaults = [NSArray arrayWithObjects: @"Paths", @"Controllers", nil ]; nkeynes@725: NSArray *values = [NSArray arrayWithObjects: paths, ctrls, nil ]; nkeynes@765: toolbar_items = [NSDictionary dictionaryWithObjects: values forKeys: toolbar_ids]; nkeynes@765: nkeynes@765: [toolbar setDelegate: self]; nkeynes@765: [toolbar setDisplayMode: NSToolbarDisplayModeIconOnly]; nkeynes@765: [toolbar setSizeMode: NSToolbarSizeModeSmall]; nkeynes@765: [toolbar setSelectedItemIdentifier: @"Paths"]; nkeynes@765: [self setToolbar: toolbar]; nkeynes@725: } nkeynes@725: nkeynes@765: - (void)paths_action: (id)sender nkeynes@765: { nkeynes@765: [self setContentView: path_pane]; nkeynes@765: } nkeynes@765: - (void)controllers_action: (id)sender nkeynes@765: { nkeynes@765: [self setContentView: ctrl_pane]; nkeynes@765: } nkeynes@765: nkeynes@765: /***************************** Toolbar methods ***************************/ nkeynes@725: - (NSToolbarItem *) createToolbarItem: (NSString *)id label: (NSString *) label nkeynes@736: tooltip: (NSString *)tooltip icon: (NSString *)icon action: (SEL) action nkeynes@725: { nkeynes@725: NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier: id]; nkeynes@725: [item setLabel: label]; nkeynes@725: [item setToolTip: tooltip]; nkeynes@725: [item setTarget: self]; nkeynes@725: NSString *iconFile = [[NSBundle mainBundle] pathForResource:icon ofType:@"png"]; nkeynes@725: NSImage *image = [[NSImage alloc] initWithContentsOfFile: iconFile]; nkeynes@725: [item setImage: image]; nkeynes@725: [item setAction: action]; nkeynes@725: return item; nkeynes@725: } nkeynes@725: - (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *)toolbar nkeynes@725: { nkeynes@765: return toolbar_ids; nkeynes@725: } nkeynes@725: nkeynes@725: - (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *)toolbar nkeynes@725: { nkeynes@765: return toolbar_defaults; nkeynes@725: } nkeynes@725: nkeynes@725: - (NSArray *)toolbarSelectableItemIdentifiers: (NSToolbar *)toolbar nkeynes@725: { nkeynes@765: return [NSArray arrayWithObjects: @"Paths", @"Controllers", nil ]; nkeynes@725: } nkeynes@725: nkeynes@725: - (NSToolbarItem *) toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier nkeynes@736: willBeInsertedIntoToolbar:(BOOL)flag nkeynes@725: { nkeynes@765: return [toolbar_items objectForKey: itemIdentifier]; nkeynes@725: } nkeynes@725: @end nkeynes@725: nkeynes@765: void cocoa_gui_show_preferences() nkeynes@725: { nkeynes@765: if( prefs_panel == NULL ) { nkeynes@765: prefs_panel = [[LxdreamPrefsPanel alloc] initWithContentRect: NSMakeRect(0,0,600,400)]; nkeynes@725: } nkeynes@765: [prefs_panel makeKeyAndOrderFront: prefs_panel]; nkeynes@765: }