prefs.m
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:19k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * prefs.m: MacOS X module for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2002-2006 the VideoLAN team
  5.  * $Id: d5e59d6fedf4f1abb5030a260202aac353387d9c $
  6.  *
  7.  * Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
  8.  *          Derk-Jan Hartman <hartman at videolan dot org>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. /* VLCPrefs manages the main preferences dialog
  25.    the class is related to wxwindows intf, PrefsPanel */
  26. /* VLCTreeItem should contain:
  27.    - the children of the treeitem
  28.    - the associated prefs widgets
  29.    - the documentview with all the prefs widgets in it
  30.    - a saveChanges action
  31.    - a revertChanges action
  32.    - a redraw view action
  33.    - the children action should generate a list of the treeitems children (to be used by VLCPrefs datasource)
  34.    The class is sort of a mix of wxwindows intfs, PrefsTreeCtrl and ConfigTreeData
  35. */
  36. /* VLCConfigControl are subclassed NSView's containing and managing individual config items
  37.    the classes are VERY closely related to wxwindows ConfigControls */
  38. /*****************************************************************************
  39.  * Preamble
  40.  *****************************************************************************/
  41. #include <stdlib.h>                                      /* malloc(), free() */
  42. #include <sys/param.h>                                    /* for MAXPATHLEN */
  43. #include <string.h>
  44. #ifdef HAVE_CONFIG_H
  45. # include "config.h"
  46. #endif
  47. #include <vlc_common.h>
  48. #include <vlc_config_cat.h>
  49. #import "intf.h"
  50. #import "prefs.h"
  51. #import "simple_prefs.h"
  52. #import "prefs_widgets.h"
  53. #import "vlc_keys.h"
  54. /* /! Warning: Unreadable code :/ */
  55. @interface VLCTreeItem : NSObject
  56. {
  57.     NSString *_name;
  58.     NSMutableArray *_children;
  59.     NSMutableArray *_options;
  60.     NSMutableArray *_subviews;
  61. }
  62. - (id)initWithName:(NSString*)name;
  63. - (int)numberOfChildren;
  64. - (VLCTreeItem *)childAtIndex:(NSInteger)i_index;
  65. - (NSString *)name;
  66. - (NSMutableArray *)children;
  67. - (NSMutableArray *)options;
  68. - (void)showView:(NSScrollView *)o_prefs_view;
  69. - (void)applyChanges;
  70. - (void)resetView;
  71. @end
  72. /* CONFIG_SUBCAT */
  73. @interface VLCTreeSubCategoryItem : VLCTreeItem
  74. {
  75.     int _subCategory;
  76. }
  77. + (VLCTreeSubCategoryItem *)subCategoryTreeItemWithSubCategory:(int)subCategory;
  78. - (id)initWithSubCategory:(int)subCategory;
  79. - (int)subCategory;
  80. @end
  81. /* Plugin daughters */
  82. @interface VLCTreePluginItem : VLCTreeItem
  83. {
  84.     module_config_t * _configItems;
  85.     unsigned int _configSize;
  86. }
  87. + (VLCTreePluginItem *)pluginTreeItemWithPlugin:(module_t *)plugin;
  88. - (id)initWithPlugin:(module_t *)plugin;
  89. - (module_config_t *)configItems;
  90. - (unsigned int)configSize;
  91. @end
  92. /* CONFIG_CAT */
  93. @interface VLCTreeCategoryItem : VLCTreeItem
  94. {
  95.     int _category;
  96. }
  97. + (VLCTreeCategoryItem *)categoryTreeItemWithCategory:(int)category;
  98. - (id)initWithCategory:(int)category;
  99. - (int)category;
  100. - (VLCTreeSubCategoryItem *)itemRepresentingSubCategory:(int)category;
  101. @end
  102. /* individual options. */
  103. @interface VLCTreeLeafItem : VLCTreeItem
  104. {
  105.     module_config_t * _configItem;
  106. }
  107. - (id)initWithConfigItem:(module_config_t *)configItem;
  108. - (module_config_t *)configItem;
  109. @end
  110. @interface VLCTreeMainItem : VLCTreePluginItem
  111. {
  112. }
  113. - (VLCTreeCategoryItem *)itemRepresentingCategory:(int)category;
  114. @end
  115. #pragma mark -
  116. /*****************************************************************************
  117.  * VLCPrefs implementation
  118.  *****************************************************************************/
  119. @implementation VLCPrefs
  120. static VLCPrefs *_o_sharedMainInstance = nil;
  121. + (VLCPrefs *)sharedInstance
  122. {
  123.     return _o_sharedMainInstance ? _o_sharedMainInstance : [[self alloc] init];
  124. }
  125. - (id)init
  126. {
  127.     if( _o_sharedMainInstance ) {
  128.         [self dealloc];
  129.     }
  130.     else
  131.     {
  132.         _o_sharedMainInstance = [super init];
  133.         p_intf = VLCIntf;
  134.         o_empty_view = [[NSView alloc] init];
  135.         _rootTreeItem = [[VLCTreeMainItem alloc] init];
  136.     }
  137.     return _o_sharedMainInstance;
  138. }
  139. - (void)dealloc
  140. {
  141.     [o_empty_view release];
  142.     [_rootTreeItem release];
  143.     [super dealloc];
  144. }
  145. - (void)awakeFromNib
  146. {
  147.     p_intf = VLCIntf;
  148.     [self initStrings];
  149.     [o_prefs_view setBorderType: NSGrooveBorder];
  150.     [o_prefs_view setHasVerticalScroller: YES];
  151.     [o_prefs_view setDrawsBackground: NO];
  152.     [o_prefs_view setDocumentView: o_empty_view];
  153.     [o_tree selectRowIndexes:[NSIndexSet indexSetWithIndex: 0] byExtendingSelection:NO];
  154. }
  155. - (void)setTitle: (NSString *) o_title_name
  156. {
  157.     [o_title setStringValue: o_title_name];
  158. }
  159. - (void)showPrefs
  160. {
  161.     [[o_basicFull_matrix cellAtRow:0 column:0] setState: NSOffState];
  162.     [[o_basicFull_matrix cellAtRow:0 column:1] setState: NSOnState];
  163.     
  164.     [o_prefs_window center];
  165.     [o_prefs_window makeKeyAndOrderFront:self];
  166.     [_rootTreeItem resetView];
  167. }
  168. - (void)initStrings
  169. {
  170.     [o_prefs_window setTitle: _NS("Preferences")];
  171.     [o_save_btn setTitle: _NS("Save")];
  172.     [o_cancel_btn setTitle: _NS("Cancel")];
  173.     [o_reset_btn setTitle: _NS("Reset All")];
  174.     [[o_basicFull_matrix cellAtRow: 0 column: 0] setStringValue: _NS("Basic")];
  175.     [[o_basicFull_matrix cellAtRow: 0 column: 1] setStringValue: _NS("All")];
  176. }
  177. - (IBAction)savePrefs: (id)sender
  178. {
  179.     /* TODO: call savePrefs on Root item */
  180.     [_rootTreeItem applyChanges];
  181.     config_SaveConfigFile( p_intf, NULL );
  182.     [o_prefs_window orderOut:self];
  183. }
  184. - (IBAction)closePrefs: (id)sender
  185. {
  186.     [o_prefs_window orderOut:self];
  187. }
  188. - (IBAction)resetAll: (id)sender
  189. {
  190.     NSBeginInformationalAlertSheet(_NS("Reset Preferences"), _NS("Cancel"),
  191.         _NS("Continue"), nil, o_prefs_window, self,
  192.         @selector(sheetDidEnd: returnCode: contextInfo:), NULL, nil,
  193.         _NS("Beware this will reset the VLC media player preferences.n"
  194.             "Are you sure you want to continue?") );
  195. }
  196. - (void)sheetDidEnd:(NSWindow *)o_sheet returnCode:(int)i_return
  197.     contextInfo:(void *)o_context
  198. {
  199.     if( i_return == NSAlertAlternateReturn )
  200.     {
  201.         config_ResetAll( p_intf );
  202.         [_rootTreeItem resetView];
  203.     }
  204. }
  205. - (IBAction)buttonAction: (id)sender
  206. {
  207.     [o_prefs_window orderOut: self];
  208.     [[o_basicFull_matrix cellAtRow:0 column:0] setState: NSOnState];
  209.     [[o_basicFull_matrix cellAtRow:0 column:1] setState: NSOffState];
  210.     [[[VLCMain sharedInstance] simplePreferences] showSimplePrefs];
  211. }
  212. - (void)loadConfigTree
  213. {
  214. }
  215. - (void)outlineViewSelectionIsChanging:(NSNotification *)o_notification
  216. {
  217. }
  218. /* update the document view to the view of the selected tree item */
  219. - (void)outlineViewSelectionDidChange:(NSNotification *)o_notification
  220. {
  221.     [[o_tree itemAtRow:[o_tree selectedRow]] showView: o_prefs_view];
  222.     [o_tree expandItem:[o_tree itemAtRow:[o_tree selectedRow]]];
  223. }
  224. @end
  225. @implementation VLCPrefs (NSTableDataSource)
  226. - (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item
  227. {
  228.     return (item == nil) ? [_rootTreeItem numberOfChildren] : [item numberOfChildren];
  229. }
  230. - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item
  231. {
  232.     return (item == nil) ? [_rootTreeItem numberOfChildren] : [item numberOfChildren];
  233. }
  234. - (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item
  235. {
  236.     return (item == nil) ? (id)[_rootTreeItem childAtIndex:index]: (id)[item childAtIndex:index];
  237. }
  238. - (id)outlineView:(NSOutlineView *)outlineView
  239.     objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
  240. {
  241.     return (item == nil) ? @"" : [item name];
  242. }
  243. @end
  244. #pragma mark -
  245. @implementation VLCTreeMainItem
  246. - (VLCTreeCategoryItem *)itemRepresentingCategory:(int)category
  247. {
  248.     for( int i = 0; i < [[self children] count]; i++ )
  249.     {
  250.         VLCTreeCategoryItem * categoryItem = [[self children] objectAtIndex:i];
  251.         if( [categoryItem category] == category )
  252.             return categoryItem;
  253.     }
  254.     return nil;
  255. }
  256. - (bool)isSubCategoryGeneral:(int)category
  257. {
  258.     if(category == SUBCAT_VIDEO_GENERAL ||
  259.           category == SUBCAT_ADVANCED_MISC ||
  260.           category == SUBCAT_INPUT_GENERAL ||
  261.           category == SUBCAT_INTERFACE_GENERAL ||
  262.           category == SUBCAT_SOUT_GENERAL||
  263.           category == SUBCAT_PLAYLIST_GENERAL||
  264.           category == SUBCAT_AUDIO_GENERAL )
  265.     {
  266.         return true;
  267.     }
  268.     return false;
  269. }
  270. /* Creates and returns the array of children
  271.  * Loads children incrementally */
  272. - (NSMutableArray *)children
  273. {
  274.     if( _children ) return _children;
  275.     _children = [[NSMutableArray alloc] init];
  276.     intf_thread_t   *p_intf = VLCIntf;
  277.     /* List the modules */
  278.     size_t count, i;
  279.     module_t ** modules = module_list_get( &count );
  280.     if( !modules ) return nil;
  281.     /* Build a tree of the plugins */
  282.     /* Add the capabilities */
  283.     for( i = 0; i < count; i++ )
  284.     {
  285.         VLCTreeCategoryItem * categoryItem = nil;
  286.         VLCTreeSubCategoryItem * subCategoryItem = nil;
  287.         VLCTreePluginItem * pluginItem = nil;
  288.         module_config_t *p_configs = NULL;
  289.         int lastsubcat = 0;
  290.         unsigned int confsize;
  291.         module_t * p_module = modules[i];
  292.         /* Exclude empty plugins (submodules don't have config */
  293.         /* options, they are stored in the parent module) */
  294.         if( module_is_main( p_module) )
  295.         {
  296.             pluginItem = self;
  297.             _configItems = module_config_get( p_module, &confsize );
  298.             _configSize = confsize;
  299.         } else {
  300.             pluginItem = [VLCTreePluginItem pluginTreeItemWithPlugin: p_module];
  301.             confsize = [pluginItem configSize];
  302.         }
  303.         p_configs = [pluginItem configItems];
  304.         unsigned int j;
  305.         for( j = 0; j < confsize; j++ )
  306.         {
  307.             int configType = p_configs[j].i_type;
  308.             if( configType == CONFIG_CATEGORY )
  309.             {
  310.                 categoryItem = [self itemRepresentingCategory:p_configs[j].value.i];
  311.                 if(!categoryItem)
  312.                 {
  313.                     categoryItem = [VLCTreeCategoryItem categoryTreeItemWithCategory:p_configs[j].value.i];
  314.                     if(categoryItem) [[self children] addObject:categoryItem];
  315.                 }
  316.             }
  317.             else if( configType == CONFIG_SUBCATEGORY )
  318.             {
  319.                 lastsubcat = p_configs[j].value.i;
  320.                 if( categoryItem && ![self isSubCategoryGeneral:lastsubcat] )
  321.                 {
  322.                     subCategoryItem = [categoryItem itemRepresentingSubCategory:lastsubcat];
  323.                     if(!subCategoryItem)
  324.                     {
  325.                         subCategoryItem = [VLCTreeSubCategoryItem subCategoryTreeItemWithSubCategory:lastsubcat];
  326.                         if(subCategoryItem) [[categoryItem children] addObject:subCategoryItem];
  327.                     }
  328.                 }
  329.             }
  330.             
  331.             if( module_is_main( p_module) && (configType & CONFIG_ITEM) )
  332.             {
  333.                 if( categoryItem && [self isSubCategoryGeneral:lastsubcat] )
  334.                 {
  335.                     [[categoryItem options] addObject:[[VLCTreeLeafItem alloc] initWithConfigItem:&p_configs[j]]];
  336.                 }
  337.                 else if( subCategoryItem )
  338.                 {
  339.                     [[subCategoryItem options] addObject:[[VLCTreeLeafItem alloc] initWithConfigItem:&p_configs[j]]];
  340.                 }
  341.             }
  342.             else if( !module_is_main( p_module) && (configType & CONFIG_ITEM))
  343.             {
  344.                 if( ![[subCategoryItem children] containsObject: pluginItem] )
  345.                 {
  346.                     [[subCategoryItem children] addObject:pluginItem];
  347.                 }
  348.                 if( pluginItem )
  349.                     [[pluginItem options] addObject:[[VLCTreeLeafItem alloc] initWithConfigItem:&p_configs[j]]];
  350.             }
  351.         }
  352.     }
  353.     module_list_free( modules );
  354.     return _children;
  355. }
  356. @end
  357. #pragma mark -
  358. @implementation VLCTreeCategoryItem
  359. + (VLCTreeCategoryItem *)categoryTreeItemWithCategory:(int)category
  360. {
  361.     if(!config_CategoryNameGet( category )) return nil;
  362.     return [[[[self class] alloc] initWithCategory:category] autorelease];
  363. }
  364. - (id)initWithCategory:(int)category
  365. {
  366.     NSString * name = [[VLCMain sharedInstance] localizedString: config_CategoryNameGet( category )];
  367.     if(self = [super initWithName:name])
  368.     {
  369.         _category = category;
  370.         //_help = [[[VLCMain sharedInstance] localizedString: config_CategoryHelpGet( category )] retain];
  371.     }
  372.     return self;
  373. }
  374. - (VLCTreeSubCategoryItem *)itemRepresentingSubCategory:(int)subCategory
  375. {
  376.     assert( [self isKindOfClass:[VLCTreeCategoryItem class]] );
  377.     for( int i = 0; i < [[self children] count]; i++ )
  378.     {
  379.         VLCTreeSubCategoryItem * subCategoryItem = [[self children] objectAtIndex:i];
  380.         if( [subCategoryItem subCategory] == subCategory )
  381.             return subCategoryItem;
  382.     }
  383.     return nil;
  384. }
  385. - (int)category
  386. {
  387.     return _category;
  388. }
  389. @end
  390. #pragma mark -
  391. @implementation VLCTreeSubCategoryItem
  392. - (id)initWithSubCategory:(int)subCategory
  393. {
  394.     NSString * name = [[VLCMain sharedInstance] localizedString: config_CategoryNameGet( subCategory )];
  395.     if(self = [super initWithName:name])
  396.     {
  397.         _subCategory = subCategory;
  398.         //_help = [[[VLCMain sharedInstance] localizedString: config_CategoryHelpGet( subCategory )] retain];
  399.     }
  400.     return self;
  401. }
  402. + (VLCTreeSubCategoryItem *)subCategoryTreeItemWithSubCategory:(int)subCategory
  403. {
  404.     if(!config_CategoryNameGet( subCategory )) return nil;
  405.     return [[[[self class] alloc] initWithSubCategory:subCategory] autorelease];
  406. }
  407. - (int)subCategory
  408. {
  409.     return _subCategory;
  410. }
  411. @end
  412. #pragma mark -
  413. @implementation VLCTreePluginItem
  414. - (id)initWithPlugin:(module_t *)plugin
  415. {
  416.     NSString * name = [[VLCMain sharedInstance] localizedString: module_get_name( plugin, false )?:""];
  417.     if(self = [super initWithName:name])
  418.     {
  419.         _configItems = module_config_get( plugin, &_configSize );
  420.         //_plugin = plugin;
  421.         //_help = [[[VLCMain sharedInstance] localizedString: config_CategoryHelpGet( subCategory )] retain];
  422.     }
  423.     return self;
  424. }
  425. + (VLCTreePluginItem *)pluginTreeItemWithPlugin:(module_t *)plugin
  426. {
  427.     return [[[[self class] alloc] initWithPlugin:plugin] autorelease];
  428. }
  429. - (void)dealloc
  430. {
  431.     module_config_free( _configItems );
  432.     [super dealloc];
  433. }
  434. - (module_config_t *)configItems
  435. {
  436.     return _configItems;
  437. }
  438. - (unsigned int)configSize
  439. {
  440.     return _configSize;
  441. }
  442. @end
  443. #pragma mark -
  444. @implementation VLCTreeLeafItem
  445. - (id)initWithConfigItem: (module_config_t *) configItem
  446. {
  447.     NSString * name = [[[VLCMain sharedInstance] localizedString:configItem->psz_name] autorelease];
  448.     self = [super initWithName:name];
  449.     if( self != nil )
  450.     {
  451.         _configItem = configItem;
  452.     }
  453.     return self;
  454. }
  455. - (module_config_t *)configItem
  456. {
  457.     return _configItem;
  458. }
  459. @end
  460. #pragma mark -
  461. #pragma mark (Root class for all TreeItems)
  462. @implementation VLCTreeItem
  463. - (id)initWithName:(NSString*)name
  464. {
  465.     self = [super init];
  466.     if( self != nil )
  467.     {
  468.         _name = [name retain];
  469.     }
  470.     return self;
  471. }
  472. - (void)dealloc
  473. {
  474.     [_children release];
  475.     [_options release];
  476.     [_name release];
  477.     [_subviews release];
  478.     [super dealloc];
  479. }
  480. - (VLCTreeItem *)childAtIndex:(NSInteger)i_index
  481. {
  482.     return [[self children] objectAtIndex:i_index];
  483. }
  484. - (int)numberOfChildren
  485. {
  486.     return [[self children] count];
  487. }
  488. - (NSString *)name
  489. {
  490.     return [[_name retain] autorelease];
  491. }
  492. - (void)showView:(NSScrollView *)prefsView
  493. {
  494.     NSRect          s_vrc;
  495.     NSView          *view;
  496.     [[VLCPrefs sharedInstance] setTitle: [self name]];
  497.     s_vrc = [[prefsView contentView] bounds]; s_vrc.size.height -= 4;
  498.     view = [[VLCFlippedView alloc] initWithFrame: s_vrc];
  499.     [view setAutoresizingMask: NSViewWidthSizable | NSViewMinYMargin | NSViewMaxYMargin];
  500.     if(!_subviews)
  501.     {
  502.         _subviews = [[NSMutableArray alloc] initWithCapacity:10];
  503.         long i;
  504.         for( i = 0; i < [[self options] count]; i++)
  505.         {
  506.             VLCTreeLeafItem * item = [[self options] objectAtIndex:i];
  507.             VLCConfigControl *control;
  508.             control = [VLCConfigControl newControl:[item configItem] withView:view];
  509.             if( control )
  510.             {
  511.                 [control setAutoresizingMask: NSViewMaxYMargin | NSViewWidthSizable];
  512.                 [_subviews addObject: control];
  513.             }
  514.         }
  515.     }
  516.     assert(view);
  517.     
  518.     int i_lastItem = 0;
  519.     int i_yPos = -2;
  520.     int i_max_label = 0;
  521.     NSEnumerator *enumerator = [_subviews objectEnumerator];
  522.     VLCConfigControl *widget;
  523.     NSRect frame;
  524.     while( ( widget = [enumerator nextObject] ) )
  525.         if( i_max_label < [widget labelSize] )
  526.             i_max_label = [widget labelSize];
  527.     enumerator = [_subviews objectEnumerator];
  528.     while( ( widget = [enumerator nextObject] ) )
  529.     {
  530.         int i_widget;
  531.         i_widget = [widget viewType];
  532.         i_yPos += [VLCConfigControl calcVerticalMargin:i_widget lastItem:i_lastItem];
  533.         [widget setYPos:i_yPos];
  534.         frame = [widget frame];
  535.         frame.size.width = [view frame].size.width - LEFTMARGIN - RIGHTMARGIN;
  536.         [widget setFrame:frame];
  537.         [widget alignWithXPosition: i_max_label];
  538.         i_yPos += [widget frame].size.height;
  539.         i_lastItem = i_widget;
  540.         [view addSubview:widget];
  541.     }
  542.     frame = [view frame];
  543.     frame.size.height = i_yPos;
  544.     [view setFrame:frame];
  545.     [prefsView setDocumentView:view];
  546. }
  547. - (void)applyChanges
  548. {
  549.     unsigned int i;
  550.     for( i = 0 ; i < [_subviews count] ; i++ )
  551.         [[_subviews objectAtIndex:i] applyChanges];
  552.     for( i = 0 ; i < [_children count] ; i++ )
  553.         [[_children objectAtIndex:i] applyChanges];
  554. }
  555. - (void)resetView
  556. {
  557.     unsigned int i;
  558.     for( i = 0 ; i < [_subviews count] ; i++ )
  559.         [[_subviews objectAtIndex:i] resetValues];
  560.     for( i = 0 ; i < [_options count] ; i++ )
  561.         [[_options objectAtIndex:i] resetView];
  562.     for( i = 0 ; i < [_children count] ; i++ )
  563.         [[_children objectAtIndex:i] resetView];
  564. }
  565. - (NSMutableArray *)children
  566. {
  567.     if(!_children) _children = [[NSMutableArray alloc] init];
  568.     return _children;
  569. }
  570. - (NSMutableArray *)options
  571. {
  572.     if(!_options) _options = [[NSMutableArray alloc] init];
  573.     return _options;
  574. }
  575. @end
  576. #pragma mark -
  577. @implementation VLCFlippedView
  578. - (BOOL)isFlipped
  579. {
  580.     return( YES );
  581. }
  582. @end