X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fprefs.m;h=cce4386f19e6e037f24e76dfe435c58813baafc3;hb=6ee1e193fd896ab9a4729fde14f009d9ce629815;hp=280a2a2cff692e6b04b90ce86efa76a3cb50ff1a;hpb=7bd1f54f1f533a4dbda9f3a6a5af0da9755e0ce6;p=vlc diff --git a/modules/gui/macosx/prefs.m b/modules/gui/macosx/prefs.m index 280a2a2cff..cce4386f19 100644 --- a/modules/gui/macosx/prefs.m +++ b/modules/gui/macosx/prefs.m @@ -1,10 +1,11 @@ /***************************************************************************** - * prefs.m: MacOS X plugin for vlc + * prefs.m: MacOS X module for vlc ***************************************************************************** - * Copyright (C) 2002 VideoLAN - * $Id: prefs.m,v 1.13 2003/02/18 00:17:06 massiot Exp $ + * Copyright (C) 2002-2006 the VideoLAN team + * $Id$ * * Authors: Jon Lech Johansen + * Derk-Jan Hartman * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,9 +19,26 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ +/* VLCPrefs manages the main preferences dialog + the class is related to wxwindows intf, PrefsPanel */ +/* VLCTreeItem should contain: + - the children of the treeitem + - the associated prefs widgets + - the documentview with all the prefs widgets in it + - a saveChanges action + - a revertChanges action + - an advanced action (to hide/show advanced options) + - a redraw view action + - the children action should generate a list of the treeitems children (to be used by VLCPrefs datasource) + + The class is sort of a mix of wxwindows intfs, PrefsTreeCtrl and ConfigTreeData +*/ +/* VLCConfigControl are subclassed NSView's containing and managing individual config items + the classes are VERY closely related to wxwindows ConfigControls */ + /***************************************************************************** * Preamble *****************************************************************************/ @@ -28,833 +46,735 @@ #include /* for MAXPATHLEN */ #include +#include +#include + #include "intf.h" #include "prefs.h" +#include "prefs_widgets.h" +#include "vlc_keys.h" /***************************************************************************** * VLCPrefs implementation *****************************************************************************/ @implementation VLCPrefs -- (id)init +static VLCPrefs *_o_sharedMainInstance = nil; + ++ (VLCPrefs *)sharedInstance { - self = [super init]; + return _o_sharedMainInstance ? _o_sharedMainInstance : [[self alloc] init]; +} - if( self != nil ) +- (id)init +{ + if( _o_sharedMainInstance ) { + [self dealloc]; + } + else { - p_intf = [NSApp getIntf]; - - o_pref_panels = [[NSMutableDictionary alloc] init]; - o_toolbars = [[NSMutableDictionary alloc] init]; - o_scroll_views = [[NSMutableDictionary alloc] init]; - o_panel_views = [[NSMutableDictionary alloc] init]; - o_save_prefs = [[NSMutableDictionary alloc] init]; + _o_sharedMainInstance = [super init]; + p_intf = VLCIntf; + o_empty_view = [[NSView alloc] init]; } - return( self ); + return _o_sharedMainInstance; } - (void)dealloc { - id v1, v2; - NSEnumerator *o_e1; - NSEnumerator *o_e2; - -#define DIC_REL1(o_dic) \ - { \ - o_e1 = [o_dic objectEnumerator]; \ - while( (v1 = [o_e1 nextObject]) ) \ - { \ - [v1 release]; \ - } \ - [o_dic removeAllObjects]; \ - [o_dic release]; \ - } - -#define DIC_REL2(o_dic) \ - { \ - o_e2 = [o_dic objectEnumerator]; \ - while( (v2 = [o_e2 nextObject]) ) \ - { \ - DIC_REL1(v2); \ - } \ - [o_dic removeAllObjects]; \ - } - - DIC_REL1(o_pref_panels); - DIC_REL2(o_toolbars); - DIC_REL1(o_scroll_views); - DIC_REL2(o_panel_views); - DIC_REL1(o_save_prefs); - -#undef DIC_REL1 -#undef DIC_REL2 - + [o_empty_view release]; [super dealloc]; } -- (BOOL)hasPrefs:(NSString *)o_module_name +- (void)awakeFromNib { - module_t *p_parser; - vlc_list_t *p_list; - char *psz_module_name; - int i_index; - - psz_module_name = (char *)[o_module_name lossyCString]; + p_intf = VLCIntf; + b_advanced = config_GetInt( p_intf, "advanced" ); + + [self initStrings]; + [o_advanced_ckb setState: b_advanced]; + [o_prefs_view setBorderType: NSGrooveBorder]; + [o_prefs_view setHasVerticalScroller: YES]; + [o_prefs_view setDrawsBackground: NO]; + [o_prefs_view setDocumentView: o_empty_view]; + [o_tree selectRow:0 byExtendingSelection:NO]; +} - /* look for module */ - p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE ); +- (void)setTitle: (NSString *) o_title_name +{ + [o_title setStringValue: o_title_name]; +} - for( i_index = 0; i_index < p_list->i_count; i_index++ ) - { - p_parser = (module_t *)p_list->p_values[i_index].p_object ; +- (void)showPrefs +{ + /* load our nib (if not already loaded) */ + [NSBundle loadNibNamed:@"Preferences" owner:self]; - if( !strcmp( p_parser->psz_object_name, psz_module_name ) ) - { - BOOL b_has_prefs = p_parser->i_config_items != 0; - vlc_list_release( p_list ); - return( b_has_prefs ); - } - } + [o_prefs_window center]; + [o_prefs_window makeKeyAndOrderFront:self]; +} - vlc_list_release( p_list ); +- (void)initStrings +{ + [o_prefs_window setTitle: _NS("Preferences")]; + [o_save_btn setTitle: _NS("Save")]; + [o_cancel_btn setTitle: _NS("Cancel")]; + [o_reset_btn setTitle: _NS("Reset All")]; + [o_advanced_ckb setTitle: _NS("Advanced")]; +} - return( NO ); +- (IBAction)savePrefs: (id)sender +{ + /* TODO: call savePrefs on Root item */ + [[VLCTreeItem rootItem] applyChanges]; + config_SaveConfigFile( p_intf, NULL ); + [o_prefs_window orderOut:self]; } -- (void)createPrefPanel:(NSString *)o_module_name +- (IBAction)closePrefs: (id)sender { - int i_pos; - int i_module_tag; + [o_prefs_window orderOut:self]; +} - module_t *p_parser = NULL; - vlc_list_t *p_list; - module_config_t *p_item; - char *psz_module_name; - int i_index; +- (IBAction)resetAll: (id)sender +{ + NSBeginInformationalAlertSheet(_NS("Reset Preferences"), _NS("Cancel"), + _NS("Continue"), nil, o_prefs_window, self, + @selector(sheetDidEnd: returnCode: contextInfo:), NULL, nil, + _NS("Beware this will reset the VLC media player preferences.\n" + "Are you sure you want to continue?") ); +} - NSPanel *o_panel; /* panel */ - NSRect s_panel_rc; /* panel rect */ - NSView *o_panel_view; /* panel view */ - NSToolbar *o_toolbar; /* panel toolbar */ - NSMutableDictionary *o_tb_items; /* panel toolbar items */ - NSScrollView *o_scroll_view; /* panel scroll view */ - NSRect s_scroll_rc; /* panel scroll view rect */ - NSMutableDictionary *o_views; /* panel scroll view docviews */ - - NSRect s_rc; /* rect */ - NSView *o_view; /* view */ - NSRect s_vrc; /* view rect */ - NSButton *o_button; /* button */ - NSRect s_brc; /* button rect */ - VLCTextField *o_text_field; /* input field / label */ - - o_panel = [o_pref_panels objectForKey: o_module_name]; - if( o_panel != nil ) +- (void)sheetDidEnd:(NSWindow *)o_sheet returnCode:(int)i_return + contextInfo:(void *)o_context +{ + if( i_return == NSAlertAlternateReturn ) { - [o_panel center]; - [o_panel makeKeyAndOrderFront: nil]; - return; + [o_prefs_view setDocumentView: o_empty_view]; + config_ResetAll( p_intf ); + [[VLCTreeItem rootItem] resetView]; + [[o_tree itemAtRow:[o_tree selectedRow]] + showView:o_prefs_view advancedView: + ( [o_advanced_ckb state] == NSOnState ) ? VLC_TRUE : VLC_FALSE]; } +} - psz_module_name = (char *)[o_module_name lossyCString]; - - /* Look for the selected module */ - p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE ); +- (IBAction)advancedToggle: (id)sender +{ + b_advanced = !b_advanced; + [o_advanced_ckb setState: b_advanced]; + /* refresh the view of the current treeitem */ + [[o_tree itemAtRow:[o_tree selectedRow]] showView:o_prefs_view advancedView: + ( [o_advanced_ckb state] == NSOnState ) ? VLC_TRUE : VLC_FALSE]; +} - for( i_index = 0; i_index < p_list->i_count; i_index++ ) - { - p_parser = (module_t *)p_list->p_values[i_index].p_object ; +- (void)loadConfigTree +{ +} - if( psz_module_name - && !strcmp( psz_module_name, p_parser->psz_object_name ) ) - { - break; - } - } +- (void)outlineViewSelectionIsChanging:(NSNotification *)o_notification +{ +} - if( !p_parser || i_index == p_list->i_count ) - { - vlc_list_release( p_list ); - return; - } +/* update the document view to the view of the selected tree item */ +- (void)outlineViewSelectionDidChange:(NSNotification *)o_notification +{ + [[o_tree itemAtRow:[o_tree selectedRow]] showView: o_prefs_view + advancedView:( [o_advanced_ckb state] == NSOnState ) ? + VLC_TRUE : VLC_FALSE]; +} - /* We found it, now we can start building its configuration interface */ - - s_panel_rc = NSMakeRect( 0, 0, 450, 450 ); - o_panel = [[NSPanel alloc] initWithContentRect: s_panel_rc - styleMask: NSTitledWindowMask - backing: NSBackingStoreBuffered - defer: YES]; - o_toolbar = [[NSToolbar alloc] initWithIdentifier: o_module_name]; - [o_panel setTitle: [NSString stringWithFormat: @"%@ (%@)", - _NS("Preferences"), o_module_name]]; - o_panel_view = [o_panel contentView]; - - s_scroll_rc = s_panel_rc; - s_scroll_rc.size.height -= 55; s_scroll_rc.origin.y += 55; - o_scroll_view = [[NSScrollView alloc] initWithFrame: s_scroll_rc]; - [o_scroll_views setObject: o_scroll_view forKey: o_module_name]; - [o_scroll_view setBorderType: NSGrooveBorder]; - [o_scroll_view setHasVerticalScroller: YES]; - [o_scroll_view setDrawsBackground: NO]; - [o_scroll_view setRulersVisible: YES]; - [o_panel_view addSubview: o_scroll_view]; - - o_tb_items = [[NSMutableDictionary alloc] init]; - o_views = [[NSMutableDictionary alloc] init]; - - [o_save_prefs setObject: [[NSMutableArray alloc] init] - forKey: o_module_name]; - - /* Enumerate config options and add corresponding config boxes */ - p_item = p_parser->p_config; - - i_pos = 0; - o_view = nil; - i_module_tag = 3; - -#define X_ORIGIN 20 -#define Y_ORIGIN (X_ORIGIN - 10) - -#define CHECK_VIEW_HEIGHT \ - { \ - float f_new_pos = s_rc.origin.y + s_rc.size.height + X_ORIGIN; \ - if( f_new_pos > s_vrc.size.height ) \ - { \ - s_vrc.size.height = f_new_pos; \ - [o_view setFrame: s_vrc]; \ - } \ - } +@end -#define CONTROL_LABEL( label ) \ - { \ - s_rc.origin.x += s_rc.size.width + 10; \ - s_rc.size.width = s_vrc.size.width - s_rc.origin.x - X_ORIGIN - 20; \ - o_text_field = [[NSTextField alloc] initWithFrame: s_rc]; \ - [o_text_field setDrawsBackground: NO]; \ - [o_text_field setBordered: NO]; \ - [o_text_field setEditable: NO]; \ - [o_text_field setSelectable: NO]; \ - [o_text_field setStringValue: \ - [NSApp localizedString: label]]; \ - [o_text_field sizeToFit]; \ - [o_view addSubview: [o_text_field autorelease]]; \ - } +@implementation VLCPrefs (NSTableDataSource) -#define INPUT_FIELD( ctype, cname, label, w, msg, param, tip ) \ - { \ - char * psz_duptip = NULL; \ - if ( p_item->psz_longtext != NULL && [NSApp getEncoding] == NSISOLatin1StringEncoding ) \ - psz_duptip = strdup(p_item->psz_longtext); \ - s_rc.size.height = 25; \ - s_rc.size.width = w; \ - s_rc.origin.y += 10; \ - CHECK_VIEW_HEIGHT; \ - o_text_field = [[VLCTextField alloc] initWithFrame: s_rc]; \ - [o_text_field setAlignment: NSRightTextAlignment]; \ - CONTROL_CONFIG( o_text_field, o_module_name, ctype, cname ); \ - [o_text_field msg: param]; \ - if ( psz_duptip != NULL ) \ - { \ - [o_text_field setToolTip: [NSApp localizedString: \ - vlc_wraptext(psz_duptip, PREFS_WRAP)]]; \ - free(psz_duptip);\ - } \ - [o_view addSubview: [o_text_field autorelease]]; \ - [[NSNotificationCenter defaultCenter] addObserver: self \ - selector: @selector(configChanged:) \ - name: NSControlTextDidChangeNotification \ - object: o_text_field]; \ - CONTROL_LABEL( label ); \ - s_rc.origin.y += s_rc.size.height; \ - s_rc.origin.x = X_ORIGIN; \ - } +- (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { + return (item == nil) ? [[VLCTreeItem rootItem] numberOfChildren] : + [item numberOfChildren]; +} -#define INPUT_FIELD_INTEGER( name, label, w, param, tip ) \ - INPUT_FIELD( CONFIG_ITEM_INTEGER, name, label, w, setIntValue, param, tip ) -#define INPUT_FIELD_FLOAT( name, label, w, param, tip ) \ - INPUT_FIELD( CONFIG_ITEM_FLOAT, name, label, w, setFloatValue, param, tip ) -#define INPUT_FIELD_STRING( name, label, w, param, tip ) \ - INPUT_FIELD( CONFIG_ITEM_STRING, name, label, w, setStringValue, param, tip ) +- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item +{ + return (item == nil) ? YES : ( ([item numberOfChildren] != -1) && + ([item numberOfChildren] != 0)); +} - if( p_item ) do - { +- (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item { + return (item == nil) ? [[VLCTreeItem rootItem] childAtIndex:index] : + (id)[item childAtIndex:index]; +} - switch( p_item->i_type ) - { +- (id)outlineView:(NSOutlineView *)outlineView + objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item +{ + return (item == nil) ? @"" : (id)[item getName]; +} - case CONFIG_HINT_CATEGORY: - { - NSString *o_key; - NSString *o_label; - NSToolbarItem *o_tbi; +@end - o_label = [NSApp localizedString: p_item->psz_text]; - o_tbi = [[NSToolbarItem alloc] initWithItemIdentifier: o_label]; - [o_tbi setImage: [NSImage imageNamed: @"NSApplicationIcon"]]; - [o_tbi setLabel: o_label]; - [o_tbi setTarget: self]; - [o_tbi setAction: @selector(selectPrefView:)]; +@implementation VLCTreeItem - o_key = [NSString stringWithFormat: @"%02d %@", - i_pos, o_label]; - [o_tb_items setObject: o_tbi forKey: o_key]; +static VLCTreeItem *o_root_item = nil; - s_vrc = s_scroll_rc; s_vrc.size.height -= 4; - o_view = [[VLCFlippedView alloc] initWithFrame: s_vrc]; - [o_views setObject: o_view forKey: o_label]; +#define IsALeafNode ((id)-1) - s_rc.origin.x = X_ORIGIN; - s_rc.origin.y = Y_ORIGIN; +- (id)initWithName: (NSString *)o_item_name + withTitle: (NSString *)o_item_title + withHelp: (NSString *)o_item_help + ID: (int)i_id + parent:(VLCTreeItem *)o_parent_item + children:(NSMutableArray *)o_children_array + whithCategory: (int) i_category +{ + self = [super init]; - i_module_tag = 3; + if( self != nil ) + { + o_name = [o_item_name copy]; + o_title= [o_item_title copy]; + o_help= [o_item_help copy]; + i_object_id = i_id; + o_parent = o_parent_item; + o_children = o_children_array; + i_object_category = i_category; + o_subviews = nil; + } + return( self ); +} - if( i_pos == 0 ) - { - [o_scroll_view setDocumentView: o_view]; - } ++ (VLCTreeItem *)rootItem +{ + if (o_root_item == nil) + o_root_item = [[VLCTreeItem alloc] initWithName:@"main" withTitle:@"main" withHelp:@"" ID:0 + parent:nil children:[[NSMutableArray alloc] initWithCapacity:10] + whithCategory: -1]; + return o_root_item; +} - i_pos++; - } - break; +- (void)dealloc +{ + if (o_children != IsALeafNode) [o_children release]; + [o_name release]; + [o_title release]; + [o_help release]; + [super dealloc]; +} - case CONFIG_ITEM_MODULE: +/* Creates and returns the array of children + * Loads children incrementally */ +- (NSArray *)children +{ + if( o_children == IsALeafNode ) + return o_children; + if( [ o_children count] == 0 ) + { + intf_thread_t *p_intf = VLCIntf; + vlc_list_t *p_list; + module_t *p_module = NULL; + module_t *p_parser; + module_config_t *p_item, + *p_end; + int i_index = 0; + + /* List the modules */ + p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE ); + if( !p_list ) return nil; + + /* get parser */ + p_parser = (module_t *)p_list->p_values[i_index].p_object; + p_end = p_parser->p_config + p_parser->confsize; + + if( [[self getName] isEqualToString: @"main"] ) { - NSBox *o_box; - NSRect s_crc; - NSView *o_cview; - NSPopUpButton *o_modules; - NSButton *o_btn_select; - NSButton *o_btn_configure; - char * psz_duptip = NULL; - if ( p_item->psz_longtext != NULL && [NSApp getEncoding] == NSISOLatin1StringEncoding ) - psz_duptip = strdup(p_item->psz_longtext); - -#define MODULE_BUTTON( button, title, sel ) \ - { \ - s_brc.size.height = 32; \ - s_brc.origin.x += s_brc.size.width + 10; \ - s_brc.size.width = s_crc.size.width - s_brc.origin.x - 10; \ - button = [[NSButton alloc] initWithFrame: s_brc]; \ - [button setButtonType: NSMomentaryPushInButton]; \ - [button setBezelStyle: NSRoundedBezelStyle]; \ - [button setTitle: title]; \ - [button setTag: i_module_tag++]; \ - [button setTarget: self]; \ - [button setAction: @selector(sel)]; \ - [o_cview addSubview: [button autorelease]]; \ - } - - s_rc.size.height = 107; - s_rc.size.width = s_vrc.size.width - X_ORIGIN * 2 - 20; - s_rc.origin.y += i_module_tag == 3 ? Y_ORIGIN : 20; - - CHECK_VIEW_HEIGHT; - - o_box = [[NSBox alloc] initWithFrame: s_rc]; - [o_box setTitle: [NSApp localizedString: p_item->psz_text]]; - [o_view addSubview: [o_box autorelease]]; - s_rc.origin.y += s_rc.size.height + 10; - o_cview = [[VLCFlippedView alloc] initWithFrame: s_rc]; - [o_box setContentView: [o_cview autorelease]]; - s_crc = [o_cview bounds]; - - s_brc = NSMakeRect( 5, 10, 200, 30 ); - o_modules = [[NSPopUpButton alloc] initWithFrame: s_brc]; - [o_modules setTag: i_module_tag++]; - [o_modules setTarget: self]; - [o_modules setAction: @selector(moduleSelected:)]; - if ( psz_duptip != NULL ) + /* + * Find the main module + */ + for( i_index = 0; i_index < p_list->i_count; i_index++ ) { - [o_modules setToolTip: [NSApp localizedString: - vlc_wraptext(psz_duptip, PREFS_WRAP)]]; - free( psz_duptip ); + p_module = (module_t *)p_list->p_values[i_index].p_object; + if( !strcmp( p_module->psz_object_name, "main" ) ) + break; } - [o_cview addSubview: [o_modules autorelease]]; - - MODULE_BUTTON( o_btn_configure, _NS("Configure"), - configureModule: ); - - s_brc = NSMakeRect( 8, s_brc.origin.y + s_brc.size.height + 10, - 194, 25 ); - o_text_field = [[VLCTextField alloc] initWithFrame: s_brc]; - [o_text_field setTag: i_module_tag++]; - [o_text_field setAlignment: NSLeftTextAlignment]; - CONTROL_CONFIG( o_text_field, o_module_name, - CONFIG_ITEM_MODULE, p_item->psz_name ); - [[NSNotificationCenter defaultCenter] addObserver: self - selector: @selector(configChanged:) - name: NSControlTextDidChangeNotification - object: o_text_field]; - [o_cview addSubview: [o_text_field autorelease]]; - - s_brc.origin.x += 3; - MODULE_BUTTON( o_btn_select, _NS("Select"), - selectModule: ); - - [o_modules addItemWithTitle: _NS("None")]; - - /* build a list of available modules */ + if( p_module == NULL ) { - for( i_index = 0; i_index < p_list->i_count; i_index++ ) + msg_Err( p_intf, + "could not load the preferences" ); + return nil; + } + if( i_index < p_list->i_count ) + { + /* We found the main module */ + /* Enumerate config categories and store a reference so we can + * generate their config panel them when it is asked by the user. */ + VLCTreeItem *p_last_category = NULL; + p_item = p_module->p_config; + o_children = [[NSMutableArray alloc] initWithCapacity:10]; + if( p_item ) do { - p_parser = (module_t *)p_list->p_values[i_index].p_object ; - - if( !strcmp( p_parser->psz_capability, - p_item->psz_type ) ) + NSString *o_child_name; + NSString *o_child_title; + NSString *o_child_help; + switch( p_item->i_type ) { - NSString *o_object_name = [NSString - stringWithCString: p_parser->psz_object_name]; - [o_modules addItemWithTitle: o_object_name]; + case CONFIG_CATEGORY: + if( p_item->value.i == -1 ) break; + + o_child_name = [[VLCMain sharedInstance] + localizedString: config_CategoryNameGet( p_item->value.i )]; + o_child_title = o_child_name; + o_child_help = [[VLCMain sharedInstance] + localizedString: config_CategoryHelpGet( p_item->value.i )]; + p_last_category = [VLCTreeItem alloc]; + [o_children addObject:[p_last_category + initWithName: o_child_name + withTitle: o_child_title + withHelp: o_child_help + ID: p_item->value.i + parent:self + children:[[NSMutableArray alloc] + initWithCapacity:10] + whithCategory: p_item - p_module->p_config]]; + break; + case CONFIG_SUBCATEGORY: + if( p_item->value.i == -1 ) break; + + if( p_item->value.i != SUBCAT_PLAYLIST_GENERAL && + p_item->value.i != SUBCAT_VIDEO_GENERAL && + p_item->value.i != SUBCAT_INPUT_GENERAL && + p_item->value.i != SUBCAT_INTERFACE_GENERAL && + p_item->value.i != SUBCAT_SOUT_GENERAL && + p_item->value.i != SUBCAT_ADVANCED_MISC && + p_item->value.i != SUBCAT_AUDIO_GENERAL ) + { + o_child_name = [[VLCMain sharedInstance] + localizedString: config_CategoryNameGet( p_item->value.i ) ]; + o_child_title = o_child_name; + o_child_help = [[VLCMain sharedInstance] + localizedString: config_CategoryHelpGet( p_item->value.i ) ]; + + [p_last_category->o_children + addObject:[[VLCTreeItem alloc] + initWithName: o_child_name + withTitle: o_child_title + withHelp: o_child_help + ID: p_item->value.i + parent:p_last_category + children:[[NSMutableArray alloc] + initWithCapacity:10] + whithCategory: p_item - p_module->p_config]]; + } + + break; + default: + break; } - } + } while( p_item < p_end && p_item++ ); } - if( p_item->psz_value != NULL ) - { - NSString *o_value = - [NSString stringWithCString: p_item->psz_value]; - - [o_text_field setStringValue: o_value]; - [o_modules selectItemWithTitle: o_value]; - [o_btn_configure setEnabled: [self hasPrefs: o_value]]; - } - else + /* Build a tree of the plugins */ + /* Add the capabilities */ + for( i_index = 0; i_index < p_list->i_count; i_index++ ) { - [o_modules selectItemWithTitle: _NS("None")]; - [o_btn_configure setEnabled: NO]; - } - -#undef MODULE_BUTTON - } - break; - - case CONFIG_ITEM_STRING: - case CONFIG_ITEM_FILE: - { - - if( !p_item->ppsz_list ) - { - char *psz_value = p_item->psz_value ? - p_item->psz_value : ""; - - INPUT_FIELD_STRING( p_item->psz_name, p_item->psz_text, 150, - [NSString stringWithCString: psz_value], - p_item->psz_longtext ); - } - else - { - int i; - VLCComboBox *o_combo_box; - char * psz_duptip = NULL; - if ( p_item->psz_longtext != NULL && [NSApp getEncoding] == NSISOLatin1StringEncoding ) - psz_duptip = strdup(p_item->psz_longtext); - - s_rc.size.height = 27; - s_rc.size.width = 150; - s_rc.origin.y += 10; - - CHECK_VIEW_HEIGHT; - - o_combo_box = [[VLCComboBox alloc] initWithFrame: s_rc]; - CONTROL_CONFIG( o_combo_box, o_module_name, - CONFIG_ITEM_STRING, p_item->psz_name ); - if ( psz_duptip != NULL ) + p_module = (module_t *)p_list->p_values[i_index].p_object; + + /* Exclude the main module */ + if( !strcmp( p_module->psz_object_name, "main" ) ) + continue; + + /* Exclude empty plugins (submodules don't have config */ + /* options, they are stored in the parent module) */ + if( p_module->b_submodule ) + continue; + else + p_item = p_module->p_config; + + if( !p_item ) continue; + int i_category = -1; + int i_subcategory = -1; + int i_options = 0; + do { - [o_combo_box setToolTip: [NSApp localizedString: - vlc_wraptext(psz_duptip, PREFS_WRAP)]]; - free( psz_duptip ); - } - [o_view addSubview: [o_combo_box autorelease]]; - [[NSNotificationCenter defaultCenter] addObserver: self - selector: @selector(configChanged:) - name: NSControlTextDidChangeNotification - object: o_combo_box]; - [[NSNotificationCenter defaultCenter] addObserver: self - selector: @selector(configChanged:) - name: NSComboBoxSelectionDidChangeNotification - object: o_combo_box]; - - for( i=0; p_item->ppsz_list[i]; i++ ) + if( p_item->i_type == CONFIG_CATEGORY ) + i_category = p_item->value.i; + else if( p_item->i_type == CONFIG_SUBCATEGORY ) + i_subcategory = p_item->value.i; + + if( p_item->i_type & CONFIG_ITEM ) + i_options ++; + if( i_options > 0 && i_category >= 0 && i_subcategory >= 0 ) + break; + } while( p_item < p_end && p_item++ ); + if( !i_options ) continue; + + /* Find the right category item */ + + long cookie; + vlc_bool_t b_found = VLC_FALSE; + unsigned int i; + VLCTreeItem* p_category_item, * p_subcategory_item; + for (i = 0 ; i < [o_children count] ; i++) { - [o_combo_box addItemWithObjectValue: - [NSString stringWithCString: p_item->ppsz_list[i]]]; + p_category_item = [o_children objectAtIndex: i]; + if( p_category_item->i_object_id == i_category ) + { + b_found = VLC_TRUE; + break; + } } + if( !b_found ) continue; - CONTROL_LABEL( p_item->psz_text ); - - s_rc.origin.y += s_rc.size.height; - s_rc.origin.x = X_ORIGIN; - } - - } - break; - - case CONFIG_ITEM_INTEGER: - { - INPUT_FIELD_INTEGER( p_item->psz_name, p_item->psz_text, 70, - p_item->i_value, p_item->psz_longtext ); - } - break; - - case CONFIG_ITEM_FLOAT: - { - INPUT_FIELD_FLOAT( p_item->psz_name, p_item->psz_text, 70, - p_item->f_value, p_item->psz_longtext ); - } - break; - - case CONFIG_ITEM_BOOL: - { - VLCButton *o_btn_bool; - char * psz_duptip = NULL; - if ( p_item->psz_longtext != NULL && [NSApp getEncoding] == NSISOLatin1StringEncoding ) - psz_duptip = strdup(p_item->psz_longtext); - - s_rc.size.height = 27; - s_rc.size.width = s_vrc.size.width - X_ORIGIN * 2 - 20; - s_rc.origin.y += 10; - - CHECK_VIEW_HEIGHT; - - o_btn_bool = [[VLCButton alloc] initWithFrame: s_rc]; - [o_btn_bool setButtonType: NSSwitchButton]; - [o_btn_bool setIntValue: p_item->i_value]; - [o_btn_bool setTitle: - [NSApp localizedString: p_item->psz_text]]; - if ( psz_duptip != NULL ) - { - [o_btn_bool setToolTip: [NSApp localizedString: - vlc_wraptext(psz_duptip, PREFS_WRAP)]]; - free( psz_duptip ); - } - [o_btn_bool setTarget: self]; - [o_btn_bool setAction: @selector(configChanged:)]; - CONTROL_CONFIG( o_btn_bool, o_module_name, - CONFIG_ITEM_BOOL, p_item->psz_name ); - [o_view addSubview: [o_btn_bool autorelease]]; - - s_rc.origin.y += s_rc.size.height; - } - break; - + /* Find subcategory item */ + b_found = VLC_FALSE; + cookie = -1; + for (i = 0 ; i < [p_category_item->o_children count] ; i++) + { + p_subcategory_item = [p_category_item->o_children + objectAtIndex: i]; + if( p_subcategory_item->i_object_id == i_subcategory ) + { + b_found = VLC_TRUE; + break; + } + } + if( !b_found ) + p_subcategory_item = p_category_item; + + [p_subcategory_item->o_children addObject:[[VLCTreeItem alloc] + initWithName:[[VLCMain sharedInstance] + localizedString: (char *)p_module->psz_shortname ? + (char *)p_module->psz_shortname : (char *)p_module->psz_object_name ] + withTitle:[[VLCMain sharedInstance] + localizedString: (char *)p_module->psz_longname ? + (char *)p_module->psz_longname : (char *)p_module->psz_object_name ] + withHelp: @"" + ID: p_module->i_object_id + parent:p_subcategory_item + children:IsALeafNode + whithCategory: -1]]; + } } - -#undef INPUT_FIELD_INTEGER -#undef INPUT_FIELD_FLOAT -#undef INPUT_FIELD_STRING -#undef INPUT_FIELD -#undef CHECK_VIEW_HEIGHT -#undef CONTROL_LABEL -#undef Y_ORIGIN -#undef X_ORIGIN - } - while( p_item->i_type != CONFIG_HINT_END && p_item++ ); - - vlc_list_release( p_list ); - - [o_toolbars setObject: o_tb_items forKey: o_module_name]; - [o_toolbar setDelegate: self]; - [o_panel setToolbar: [o_toolbar autorelease]]; - -#define DEF_PANEL_BUTTON( tag, title, sel ) \ - { \ - o_button = [[NSButton alloc] initWithFrame: s_rc]; \ - [o_button setButtonType: NSMomentaryPushInButton]; \ - [o_button setBezelStyle: NSRoundedBezelStyle]; \ - [o_button setAction: @selector(sel)]; \ - [o_button setTarget: self]; \ - [o_button setTitle: title]; \ - [o_button setTag: tag]; \ - [o_panel_view addSubview: [o_button autorelease]]; \ + vlc_list_release( p_list ); } - - s_rc.origin.y = s_panel_rc.origin.y + 14; - s_rc.size.height = 25; s_rc.size.width = 105; - s_rc.origin.x = s_panel_rc.size.width - s_rc.size.width - 14; - DEF_PANEL_BUTTON( 0, _NS("OK"), clickedCancelOK: ); - [o_panel setDefaultButtonCell: [o_button cell]]; - - s_rc.origin.x -= s_rc.size.width; - DEF_PANEL_BUTTON( 1, _NS("Cancel"), clickedCancelOK: ); - [o_button setKeyEquivalent: @"\E"]; - - s_rc.origin.x -= s_rc.size.width; - DEF_PANEL_BUTTON( 2, _NS("Apply"), clickedApply: ); - [o_button setEnabled: NO]; - -#undef DEF_PANEL_BUTTON - - [o_pref_panels setObject: o_panel forKey: o_module_name]; - [o_panel_views setObject: o_views forKey: o_module_name]; - - [o_panel center]; - [o_panel makeKeyAndOrderFront: nil]; + return o_children; } -- (void)destroyPrefPanel:(id)o_unknown +- (int)getObjectID { - id v1; - NSPanel *o_panel; - NSEnumerator *o_e1; - NSMutableArray *o_prefs; - NSMutableDictionary *o_dic; - NSScrollView *o_scroll_view; - NSString *o_module_name; - - o_module_name = (NSString *)([o_unknown isKindOfClass: [NSTimer class]] ? - [o_unknown userInfo] : o_unknown); - -#define DIC_REL(dic) \ - { \ - o_dic = [dic objectForKey: o_module_name]; \ - [dic removeObjectForKey: o_module_name]; \ - o_e1 = [o_dic objectEnumerator]; \ - while( (v1 = [o_e1 nextObject]) ) \ - { \ - [v1 release]; \ - } \ - [o_dic removeAllObjects]; \ - [o_dic release]; \ - } - - o_panel = [o_pref_panels objectForKey: o_module_name]; - [o_pref_panels removeObjectForKey: o_module_name]; - [o_panel release]; - - DIC_REL(o_toolbars); - - o_scroll_view = [o_scroll_views objectForKey: o_module_name]; - [o_scroll_views removeObjectForKey: o_module_name]; - [o_scroll_view release]; - - DIC_REL(o_panel_views); - - o_prefs = [o_save_prefs objectForKey: o_module_name]; - [o_save_prefs removeObjectForKey: o_module_name]; - [o_prefs removeAllObjects]; - [o_prefs release]; - -#undef DIC_REL - + return i_object_id; } -- (void)selectPrefView:(id)sender +- (NSString *)getName { - NSView *o_view; - NSString *o_module_name; - NSScrollView *o_scroll_view; - NSMutableDictionary *o_views; - - o_module_name = [[sender toolbar] identifier]; - o_views = [o_panel_views objectForKey: o_module_name]; - o_view = [o_views objectForKey: [sender label]]; - - o_scroll_view = [o_scroll_views objectForKey: o_module_name]; - [o_scroll_view setDocumentView: o_view]; + return o_name; } -- (void)moduleSelected:(id)sender +- (NSString *)getTitle { - NSButton *o_btn_config; - NSString *o_module_name; - BOOL b_has_prefs = NO; - - o_module_name = [sender titleOfSelectedItem]; - o_btn_config = [[sender superview] viewWithTag: [sender tag] + 1]; - - if( ![o_module_name isEqualToString: _NS("None")] ) - { - b_has_prefs = [self hasPrefs: o_module_name]; - } - - [o_btn_config setEnabled: b_has_prefs]; + return o_title; } -- (void)configureModule:(id)sender +- (NSString *)getHelp { - NSString *o_module_name; - NSPopUpButton *o_modules; - - o_modules = [[sender superview] viewWithTag: [sender tag] - 1]; - o_module_name = [o_modules titleOfSelectedItem]; - - [self createPrefPanel: o_module_name]; + return o_help; } -- (void)selectModule:(id)sender +- (VLCTreeItem *)childAtIndex:(int)i_index { - NSString *o_module_name; - NSPopUpButton *o_modules; - NSTextField *o_module; - - o_module = [[sender superview] viewWithTag: [sender tag] - 1]; - o_modules = [[sender superview] viewWithTag: [sender tag] - 3]; - o_module_name = [o_modules titleOfSelectedItem]; - - if( [o_module_name isEqualToString: _NS("None")] ) - { - o_module_name = [NSString string]; - } + return [[self children] objectAtIndex:i_index]; +} - [o_module setStringValue: o_module_name]; - [self configChanged: o_module]; +- (int)numberOfChildren { + id i_tmp = [self children]; + return (i_tmp == IsALeafNode) ? (-1) : (int)[i_tmp count]; } -- (void)configChanged:(id)o_unknown +- (BOOL)hasPrefs:(NSString *)o_module_name { - id o_vlc_config = [o_unknown isKindOfClass: [NSNotification class]] ? - [o_unknown object] : o_unknown; + intf_thread_t *p_intf = VLCIntf; + module_t *p_parser; + vlc_list_t *p_list; + char *psz_module_name; + int i_index; - NSString *o_module_name = [o_vlc_config moduleName]; - NSPanel *o_pref_panel = [o_pref_panels objectForKey: o_module_name]; - NSMutableArray *o_prefs = [o_save_prefs objectForKey: o_module_name]; + psz_module_name = (char *)[o_module_name UTF8String]; - if( [o_prefs indexOfObjectIdenticalTo: o_vlc_config] == NSNotFound ) + /* look for module */ + p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE ); + + for( i_index = 0; i_index < p_list->i_count; i_index++ ) { - NSView *o_pref_view = [o_pref_panel contentView]; - NSButton *o_btn_apply = [o_pref_view viewWithTag: 2]; + p_parser = (module_t *)p_list->p_values[i_index].p_object ; - [o_prefs addObject: o_vlc_config]; - [o_btn_apply setEnabled: YES]; + if( !strcmp( p_parser->psz_object_name, psz_module_name ) ) + { + BOOL b_has_prefs = p_parser->i_config_items != 0; + vlc_list_release( p_list ); + return( b_has_prefs ); + } } -} -- (void)clickedApply:(id)sender -{ - id o_vlc_control; - NSEnumerator *o_enum; + vlc_list_release( p_list ); - NSView *o_config_view = [sender superview]; - NSWindow *o_config_panel = [o_config_view window]; - NSButton *o_btn_apply = [o_config_view viewWithTag: 2]; - NSString *o_module_name = [[o_config_panel toolbar] identifier]; - NSMutableArray *o_prefs = [o_save_prefs objectForKey: o_module_name]; + return( NO ); +} - o_enum = [o_prefs objectEnumerator]; - while( ( o_vlc_control = [o_enum nextObject] ) ) +- (NSView *)showView:(NSScrollView *)o_prefs_view + advancedView:(vlc_bool_t) b_advanced +{ + NSRect s_vrc; + NSView *o_view; + + [[VLCPrefs sharedInstance] setTitle: [self getTitle]]; + /* NSLog( [self getHelp] ); */ + s_vrc = [[o_prefs_view contentView] bounds]; s_vrc.size.height -= 4; + o_view = [[VLCFlippedView alloc] initWithFrame: s_vrc]; + [o_view setAutoresizingMask: NSViewWidthSizable | NSViewMinYMargin | + NSViewMaxYMargin]; + +/* Create all subviews if it isn't already done because we cannot use */ +/* setHiden for MacOS < 10.3*/ + if( o_subviews == nil ) { - int i_type = [o_vlc_control configType]; - NSString *o_name = [o_vlc_control configName]; - char *psz_name = (char *)[o_name lossyCString]; - - switch( i_type ) + intf_thread_t *p_intf = VLCIntf; + vlc_list_t *p_list; + module_t *p_parser = NULL; + module_config_t *p_item, + *p_end; + + o_subviews = [[NSMutableArray alloc] initWithCapacity:10]; + /* Get a pointer to the module */ + if( i_object_category == -1 ) { - - case CONFIG_ITEM_MODULE: - case CONFIG_ITEM_STRING: - case CONFIG_ITEM_FILE: + p_parser = (module_t *) vlc_object_get( p_intf, i_object_id ); + if( !p_parser || p_parser->i_object_type != VLC_OBJECT_MODULE ) { - char *psz_value; - NSString *o_value; - - o_value = [o_vlc_control stringValue]; - psz_value = (char *)[o_value lossyCString]; - - config_PutPsz( p_intf, psz_name, - *psz_value ? psz_value : NULL ); + /* 0OOoo something went really bad */ + return nil; } - break; + + p_end = p_parser->p_config + p_parser->confsize; + + p_item = p_parser->p_config; + + p_item = p_parser->p_config + 1; - case CONFIG_ITEM_INTEGER: - case CONFIG_ITEM_BOOL: + do { - int i_value = [o_vlc_control intValue]; + if( !p_item ) + { + msg_Err( p_intf, "invalid preference item found" ); + break; + } + if( p_item > p_end ) + break; + switch(p_item->i_type) + { + case CONFIG_SUBCATEGORY: + break; + case CONFIG_CATEGORY: + break; + case CONFIG_SECTION: + break; + case CONFIG_HINT_USAGE: + break; + default: + { + VLCConfigControl *o_control = nil; + o_control = [VLCConfigControl newControl:p_item + withView:o_view]; + if( o_control != nil ) + { + [o_control setAutoresizingMask: NSViewMaxYMargin | + NSViewWidthSizable]; + [o_subviews addObject: o_control]; + } + } + break; + } + } while( p_item < p_end && p_item++ ); - config_PutInt( p_intf, psz_name, i_value ); + vlc_object_release( p_parser ); + } + else + { + int i_index; + p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE ); + if( !p_list ) return o_view; + + /* + * Find the main module + */ + for( i_index = 0; i_index < p_list->i_count; i_index++ ) + { + p_parser = (module_t *)p_list->p_values[i_index].p_object; + if( !strcmp( p_parser->psz_object_name, "main" ) ) + break; } - break; - - case CONFIG_ITEM_FLOAT: + if( p_parser == NULL ) { - float f_value = [o_vlc_control floatValue]; - - config_PutFloat( p_intf, psz_name, f_value ); + msg_Err( p_intf, "could not load preferences" ); + return o_view; } + p_end = p_parser->p_config + p_parser->confsize; + + p_item = (p_parser->p_config + i_object_category); + if( ( p_item->i_type == CONFIG_CATEGORY ) && + ( ( p_item->value.i == CAT_PLAYLIST ) || + ( p_item->value.i == CAT_AUDIO ) || + ( p_item->value.i == CAT_VIDEO ) || + ( p_item->value.i == CAT_INTERFACE ) || + ( p_item->value.i == CAT_INPUT ) || + ( p_item->value.i == CAT_SOUT ) ) ) + p_item++; + + do + { + p_item++; + if( !p_item ) + { + msg_Err( p_intf, "invalid preference item found" ); + break; + } + if( p_item > p_end ) + break; + switch( p_item->i_type ) + { + case CONFIG_SUBCATEGORY: + break; + case CONFIG_CATEGORY: + break; + case CONFIG_SECTION: + break; + case CONFIG_HINT_USAGE: + break; + default: + { + VLCConfigControl *o_control = nil; + if( p_item->b_internal == VLC_TRUE ) + { break; + } + o_control = [VLCConfigControl newControl:p_item + withView:o_view]; + if( o_control != nil ) + { + [o_control setAutoresizingMask: NSViewMaxYMargin | + NSViewWidthSizable]; + [o_subviews addObject: o_control]; + } + break; + } + } + } while ( ( p_item < p_end ) && + ( p_item->i_type != CONFIG_SUBCATEGORY ) ); + vlc_list_release( p_list ); } } - [o_btn_apply setEnabled: NO]; - [o_prefs removeAllObjects]; - - config_SaveConfigFile( p_intf, NULL ); -} - -- (void)clickedCancelOK:(id)sender -{ - NSWindow *o_pref_panel = [[sender superview] window]; - NSString *o_module_name = [[o_pref_panel toolbar] identifier]; - - if( [[sender title] isEqualToString: _NS("OK")] ) + if( o_view != nil ) { - [self clickedApply: sender]; - } - - [o_pref_panel close]; - - if( [self respondsToSelector: @selector(performSelectorOnMainThread: - withObject:waitUntilDone:)] ) - { - [self performSelectorOnMainThread: @selector(destroyPrefPanel:) - withObject: o_module_name - waitUntilDone: NO]; - } - else - { - [NSTimer scheduledTimerWithTimeInterval: 0.1 - target: self selector: @selector(destroyPrefPanel:) - userInfo: o_module_name repeats: NO]; - } -} - -@end - -@implementation VLCPrefs (NSToolbarDelegate) + int i_lastItem = 0; + int i_yPos = -2; + int i_max_label = 0; + int i_show_advanced = 0; + + NSEnumerator *enumerator = [o_subviews objectEnumerator]; + VLCConfigControl *o_widget; + NSRect o_frame; + + while( ( o_widget = [enumerator nextObject] ) ) + if( ( [o_widget isAdvanced] ) && (! b_advanced) ) + continue; + else if( i_max_label < [o_widget getLabelSize] ) + i_max_label = [o_widget getLabelSize]; + + enumerator = [o_subviews objectEnumerator]; + while( ( o_widget = [enumerator nextObject] ) ) + { + int i_widget; + if( ( [o_widget isAdvanced] ) && (! b_advanced) ) + { + i_show_advanced++; + continue; + } -- (NSToolbarItem *)toolbar:(NSToolbar *)o_toolbar - itemForItemIdentifier:(NSString *)o_item_id - willBeInsertedIntoToolbar:(BOOL)b_flag -{ - NSMutableDictionary *o_toolbar_items; - NSString *o_module_name = [o_toolbar identifier]; + i_widget = [o_widget getViewType]; + i_yPos += [VLCConfigControl calcVerticalMargin:i_widget + lastItem:i_lastItem]; + [o_widget setYPos:i_yPos]; + o_frame = [o_widget frame]; + o_frame.size.width = [o_view frame].size.width - + LEFTMARGIN - RIGHTMARGIN; + [o_widget setFrame:o_frame]; + [o_widget alignWithXPosition: i_max_label]; + i_yPos += [o_widget frame].size.height; + i_lastItem = i_widget; + [o_view addSubview:o_widget]; + } + if( i_show_advanced != 0 ) + { + /* We add the advanced notice... */ + NSRect s_rc = [o_view frame]; + NSTextField *o_label; + s_rc.size.height = 17; + s_rc.origin.x = LEFTMARGIN; + s_rc.origin.y = i_yPos += [VLCConfigControl + calcVerticalMargin:CONFIG_ITEM_STRING + lastItem:i_lastItem]; + o_label = [[[NSTextField alloc] initWithFrame: s_rc] retain]; + [o_label setDrawsBackground: NO]; + [o_label setBordered: NO]; + [o_label setEditable: NO]; + [o_label setSelectable: NO]; + [o_label setStringValue: _NS("Some options are hidden. " \ + "Check \"Advanced\" to display them.")]; + [o_label setFont:[NSFont systemFontOfSize:10]]; + [o_label sizeToFit]; + [o_view addSubview:o_label]; + i_yPos += [o_label frame].size.height; + } + o_frame = [o_view frame]; + o_frame.size.height = i_yPos; + [o_view setFrame:o_frame]; + [o_prefs_view setDocumentView:o_view]; - o_toolbar_items = [o_toolbars objectForKey: o_module_name]; - if( o_toolbar_items == nil ) - { - return( nil ); } - - return( [o_toolbar_items objectForKey: o_item_id] ); + return o_view; } -- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)o_toolbar +- (void)applyChanges { - return( [self toolbarDefaultItemIdentifiers: o_toolbar] ); + unsigned int i; + if( o_subviews != nil ) + //Item has been shown + for( i = 0 ; i < [o_subviews count] ; i++ ) + [[o_subviews objectAtIndex:i] applyChanges]; + + if( o_children != IsALeafNode ) + for( i = 0 ; i < [o_children count] ; i++ ) + [[o_children objectAtIndex:i] applyChanges]; } -- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)o_toolbar +- (void)resetView { - NSArray *o_ids; - NSMutableDictionary *o_toolbar_items; - NSString *o_module_name = [o_toolbar identifier]; - - o_toolbar_items = [o_toolbars objectForKey: o_module_name]; - if( o_toolbar_items == nil ) + unsigned int i; + if( o_subviews != nil ) { - return( nil ); + //Item has been shown + [o_subviews release]; + o_subviews = nil; } - o_ids = [[o_toolbar_items allKeys] - sortedArrayUsingSelector: @selector(compare:)]; - - return( o_ids ); + if( o_children != IsALeafNode ) + for( i = 0 ; i < [o_children count] ; i++ ) + [[o_children objectAtIndex:i] resetView]; } @end + @implementation VLCFlippedView - (BOOL)isFlipped @@ -863,7 +783,3 @@ } @end - -IMPL_CONTROL_CONFIG(Button); -IMPL_CONTROL_CONFIG(ComboBox); -IMPL_CONTROL_CONFIG(TextField);