prefs_widgets.m
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:36k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * prefs_widgets.m: Preferences controls
  3.  *****************************************************************************
  4.  * Copyright (C) 2002-2003 VideoLAN
  5.  * $Id: prefs_widgets.m 8571 2004-08-29 15:11:50Z hartman $
  6.  *
  7.  * Authors: Derk-Jan Hartman <hartman at videolan.org> 
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  * 
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #include <stdlib.h>                                      /* malloc(), free() */
  27. #include <string.h>
  28. #include <vlc/vlc.h>
  29. #include "vlc_keys.h"
  30. #include "intf.h"
  31. #include "prefs_widgets.h"
  32. #define PREFS_WRAP 300
  33. #define OFFSET_RIGHT 20
  34. #define OFFSET_BETWEEN 10
  35. @implementation VLCConfigControl
  36. - (id)initWithFrame: (NSRect)frame
  37. {
  38.     return [self initWithFrame: frame
  39.                     item: nil
  40.                     withObject: nil];
  41. }
  42. - (id)initWithFrame: (NSRect)frame
  43.         item: (module_config_t *)p_item
  44.         withObject: (vlc_object_t *)_p_this
  45. {
  46.     self = [super initWithFrame: frame];
  47.     if( self != nil )
  48.     {
  49.         p_this = _p_this;
  50.         o_label = NULL;
  51.         psz_name = strdup( p_item->psz_name );
  52.         i_type = p_item->i_type;
  53.         b_advanced = p_item->b_advanced;
  54.         [self setAutoresizingMask:NSViewWidthSizable | NSViewMinYMargin ];
  55.     }
  56.     return (self);
  57. }
  58. - (void)dealloc
  59. {
  60.     if( o_label ) [o_label release];
  61.     if( psz_name ) free( psz_name );
  62.     [super dealloc];
  63. }
  64. + (VLCConfigControl *)newControl: (module_config_t *)p_item withView: (NSView *)o_parent_view withObject: (vlc_object_t *)_p_this
  65. {
  66.     VLCConfigControl *p_control = NULL;
  67.     NSRect frame = [o_parent_view bounds];
  68.     
  69.     switch( p_item->i_type )
  70.     {
  71.     case CONFIG_ITEM_MODULE:
  72.         p_control = [[ModuleConfigControl alloc] initWithFrame: frame item: p_item withObject: _p_this ];
  73.         break;
  74.     case CONFIG_ITEM_STRING:
  75.         if( !p_item->i_list )
  76.         {
  77.             p_control = [[StringConfigControl alloc] initWithFrame: frame item: p_item withObject: _p_this ];
  78.         }
  79.         else
  80.         {
  81.             p_control = [[StringListConfigControl alloc] initWithFrame: frame item: p_item withObject: _p_this ];
  82.         }
  83.         break;
  84.         
  85.     case CONFIG_ITEM_FILE:
  86.     case CONFIG_ITEM_DIRECTORY:
  87.         p_control = [[FileConfigControl alloc] initWithFrame: frame item: p_item withObject: _p_this ];
  88.         break;
  89.     case CONFIG_ITEM_INTEGER:
  90.         if( p_item->i_list )
  91.         {
  92.             p_control = [[IntegerListConfigControl alloc] initWithFrame: frame item: p_item withObject: _p_this ];
  93.         }
  94.         else if( p_item->i_min != 0 || p_item->i_max != 0 )
  95.         {
  96.             p_control = [[RangedIntegerConfigControl alloc] initWithFrame: frame item: p_item withObject: _p_this ];
  97.         }
  98.         else
  99.         {
  100.             p_control = [[IntegerConfigControl alloc] initWithFrame: frame item: p_item withObject: _p_this ];
  101.         }
  102.         break;
  103.     case CONFIG_ITEM_KEY:
  104.         p_control = [[KeyConfigControl alloc] initWithFrame: frame item: p_item withObject: _p_this ];
  105.         break;
  106.     case CONFIG_ITEM_FLOAT:
  107.         if( p_item->f_min != 0 || p_item->f_max != 0 )
  108.         {
  109.             p_control = [[RangedFloatConfigControl alloc] initWithFrame: frame item: p_item withObject: _p_this ];
  110.         }
  111.         else
  112.         {
  113.             p_control = [[FloatConfigControl alloc] initWithFrame: frame item: p_item withObject: _p_this ];
  114.         }
  115.         break;
  116.     case CONFIG_ITEM_BOOL:
  117.         p_control = [[BoolConfigControl alloc] initWithFrame: frame item: p_item withObject: _p_this ];
  118.         break;
  119.         
  120.     default:
  121.         break;
  122.     }
  123.     return p_control;
  124. }
  125. - (NSString *)getName
  126. {
  127.     return [NSApp localizedString: psz_name];
  128. }
  129. - (int)getType
  130. {
  131.     return i_type;
  132. }
  133. - (BOOL)isAdvanced
  134. {
  135.     return b_advanced;
  136. }
  137. - (int)intValue
  138. {
  139.     return 0;
  140. }
  141. - (float)floatValue
  142. {
  143.     return 0;
  144. }
  145. - (char *)stringValue
  146. {
  147.     return NULL;
  148. }
  149. @end
  150. @implementation KeyConfigControl
  151. - (id)initWithFrame: (NSRect)frame
  152.         item: (module_config_t *)p_item
  153.         withObject: (vlc_object_t *)_p_this
  154. {
  155.     frame.size.height = 80;
  156.     if( self = [super initWithFrame: frame item: p_item
  157.                 withObject: _p_this] )
  158.     {
  159.         NSRect s_rc = frame;
  160.         unsigned int i;
  161.         o_matrix = [[[NSMatrix alloc] initWithFrame: s_rc mode: NSHighlightModeMatrix cellClass: [NSButtonCell class] numberOfRows:2 numberOfColumns:2] retain];
  162.         NSArray *o_cells = [o_matrix cells];
  163.         for( i = 0; i < [o_cells count]; i++ )
  164.         {
  165.             NSButtonCell *o_current_cell = [o_cells objectAtIndex:i];
  166.             [o_current_cell setButtonType: NSSwitchButton];
  167.             [o_current_cell setControlSize: NSSmallControlSize];
  168.             [o_matrix setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext] toWidth: PREFS_WRAP] forCell: o_current_cell];
  169.             switch( i )
  170.             {
  171.                 case 0:
  172.                     [o_current_cell setTitle:_NS("Command")];
  173.                     [o_current_cell setState: p_item->i_value & KEY_MODIFIER_COMMAND];
  174.                     break;
  175.                 case 1:
  176.                     [o_current_cell setTitle:_NS("Control")];
  177.                     [o_current_cell setState: p_item->i_value & KEY_MODIFIER_CTRL];
  178.                     break;
  179.                 case 2:
  180.                     [o_current_cell setTitle:_NS("Option/Alt")];
  181.                     [o_current_cell setState: p_item->i_value & KEY_MODIFIER_ALT];
  182.                     break;
  183.                 case 3:
  184.                     [o_current_cell setTitle:_NS("Shift")];
  185.                     [o_current_cell setState: p_item->i_value & KEY_MODIFIER_SHIFT];
  186.                     break;
  187.             }
  188.         }
  189.         [o_matrix sizeToCells];
  190.         [o_matrix setAutoresizingMask:NSViewMaxXMargin ];
  191.         [[self contentView] addSubview: o_matrix];
  192.         /* add the combo box */
  193.         s_rc.origin.x += [o_matrix frame].size.width + OFFSET_BETWEEN;
  194.         s_rc.size.height = 22;
  195.         s_rc.size.width = 100;
  196.         o_combo = [[[NSComboBox alloc] initWithFrame: s_rc] retain];
  197.         [o_combo setAutoresizingMask:NSViewMaxXMargin ];
  198.         [o_combo setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext] toWidth: PREFS_WRAP]];
  199.         
  200.         for( i = 0; i < sizeof(vlc_keys) / sizeof(key_descriptor_t); i++ )
  201.         {
  202.             
  203.             if( vlc_keys[i].psz_key_string && *vlc_keys[i].psz_key_string )
  204.             [o_combo addItemWithObjectValue: [NSApp localizedString:vlc_keys[i].psz_key_string]];
  205.         }
  206.         
  207.         [o_combo setStringValue: [NSApp localizedString:KeyToString(( ((unsigned int)p_item->i_value) & ~KEY_MODIFIER ))]];
  208.         [[self contentView] addSubview: o_combo];
  209.         
  210.         /* add the label */
  211.         s_rc.origin.y += 50;
  212.         
  213.         o_label = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  214.         [o_label setDrawsBackground: NO];
  215.         [o_label setBordered: NO];
  216.         [o_label setEditable: NO];
  217.         [o_label setSelectable: NO];
  218.         if ( p_item->psz_text )
  219.             [o_label setStringValue: [NSApp localizedString: p_item->psz_text]];
  220.         [o_label sizeToFit];
  221.         [[self contentView] addSubview: o_label];
  222.         [o_label setAutoresizingMask:NSViewMaxXMargin ];
  223.     }
  224.     return self;
  225. }
  226. - (void)dealloc
  227. {
  228.     [o_matrix release];
  229.     [o_combo release];
  230.     [super dealloc];
  231. }
  232. - (int)getIntValue
  233. {
  234.     unsigned int i, i_new_key = 0;
  235.     NSButtonCell *o_current_cell;
  236.     NSArray *o_cells = [o_matrix cells];
  237.     for( i = 0; i < [o_cells count]; i++ )
  238.     {
  239.         o_current_cell = [o_cells objectAtIndex:i];
  240.         if( [[o_current_cell title] isEqualToString:_NS("Command")] && 
  241.             [o_current_cell state] == NSOnState )
  242.         {
  243.             i_new_key |= KEY_MODIFIER_COMMAND;
  244.         }
  245.         if( [[o_current_cell title] isEqualToString:_NS("Control")] && 
  246.             [o_current_cell state] == NSOnState )
  247.         {
  248.             i_new_key |= KEY_MODIFIER_CTRL;
  249.         }
  250.         if( [[o_current_cell title] isEqualToString:_NS("Option/Alt")] && 
  251.             [o_current_cell state] == NSOnState )
  252.         {
  253.             i_new_key |= KEY_MODIFIER_ALT;
  254.         }
  255.         if( [[o_current_cell title] isEqualToString:_NS("Shift")] && 
  256.             [o_current_cell state] == NSOnState )
  257.         {
  258.             i_new_key |= KEY_MODIFIER_SHIFT;
  259.         }
  260.     }
  261.     i_new_key |= StringToKey([[o_combo stringValue] cString]);
  262.     return i_new_key;
  263. }
  264. @end
  265. @implementation ModuleConfigControl
  266. - (id)initWithFrame: (NSRect)frame
  267.         item: (module_config_t *)p_item
  268.         withObject: (vlc_object_t *)_p_this
  269. {
  270.     frame.size.height = 20;
  271.     if( self = [super initWithFrame: frame item: p_item
  272.                 withObject: _p_this] )
  273.     {
  274.         vlc_list_t *p_list;
  275.         module_t *p_parser;
  276.         NSRect s_rc = frame;
  277.         int i_index;
  278.         /* add the label */
  279.         o_label = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  280.         [o_label setDrawsBackground: NO];
  281.         [o_label setBordered: NO];
  282.         [o_label setEditable: NO];
  283.         [o_label setSelectable: NO];
  284.         if ( p_item->psz_text )
  285.             [o_label setStringValue: [NSApp localizedString: p_item->psz_text]];
  286.         [o_label sizeToFit];
  287.         [[self contentView] addSubview: o_label];
  288.         [o_label setAutoresizingMask:NSViewMaxXMargin ];
  289.         
  290.         /* build the popup */
  291.         s_rc.origin.x = s_rc.size.width - 200 - OFFSET_RIGHT;
  292.         s_rc.size.width = 200;
  293.         
  294.         o_popup = [[[NSPopUpButton alloc] initWithFrame: s_rc] retain];
  295.         [[self contentView] addSubview: o_popup];
  296.         [o_popup setAutoresizingMask:NSViewMinXMargin ];
  297.         [o_popup setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  298.         [o_popup addItemWithTitle: _NS("Default")];
  299.         [[o_popup lastItem] setTag: -1];
  300.         [o_popup selectItem: [o_popup lastItem]];
  301.         
  302.         /* build a list of available modules */
  303.         p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
  304.         for( i_index = 0; i_index < p_list->i_count; i_index++ )
  305.         {
  306.             p_parser = (module_t *)p_list->p_values[i_index].p_object ;
  307.             if( !strcmp( p_parser->psz_capability,
  308.                         p_item->psz_type ) )
  309.             {
  310.                 NSString *o_description = [NSApp
  311.                     localizedString: p_parser->psz_longname];
  312.                 [o_popup addItemWithTitle: o_description];
  313.                 if( p_item->psz_value &&
  314.                     !strcmp( p_item->psz_value, p_parser->psz_object_name ) )
  315.                 {
  316.                     [o_popup selectItem:[o_popup lastItem]];
  317.                 }
  318.             }
  319.         }
  320.         vlc_list_release( p_list );
  321.     }
  322.     return self;
  323. }
  324. - (void)dealloc
  325. {
  326.     [o_popup release];
  327.     [super dealloc];
  328. }
  329. - (char *)stringValue
  330. {
  331.     NSString *newval = [o_popup stringValue];
  332.     char *returnval;
  333.     int i_index;
  334.     vlc_list_t *p_list;
  335.     module_t *p_parser;
  336.     module_config_t *p_item;
  337.     p_item = config_FindConfig( p_this, psz_name );
  338.     p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
  339.     for( i_index = 0; i_index < p_list->i_count; i_index++ )
  340.     {
  341.         p_parser = (module_t *)p_list->p_values[i_index].p_object ;
  342.         if( !strcmp( p_parser->psz_capability,
  343.                     p_item->psz_type ) )
  344.         {
  345.             NSString *o_description = [NSApp
  346.                 localizedString: p_parser->psz_longname];
  347.             
  348.             if( [newval isEqualToString: o_description] )
  349.             {
  350.                 returnval = strdup(p_parser->psz_object_name);
  351.                 break;
  352.             }
  353.         }
  354.     }
  355.     vlc_list_release( p_list );
  356.     return returnval;
  357. }
  358. @end
  359. @implementation StringConfigControl
  360. - (id)initWithFrame: (NSRect)frame
  361.         item: (module_config_t *)p_item
  362.         withObject: (vlc_object_t *)_p_this
  363. {
  364.     frame.size.height = 22;
  365.     if( self = [super initWithFrame: frame item: p_item
  366.                 withObject: _p_this] )
  367.     {
  368.         NSRect s_rc = frame;
  369.         /* add the label */
  370.         o_label = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  371.         [o_label setDrawsBackground: NO];
  372.         [o_label setBordered: NO];
  373.         [o_label setEditable: NO];
  374.         [o_label setSelectable: NO];
  375.         if( p_item->psz_text )
  376.             [o_label setStringValue: [NSApp localizedString: p_item->psz_text]];
  377.         [o_label sizeToFit];
  378.         [[self contentView] addSubview: o_label];
  379.         [o_label setAutoresizingMask:NSViewMaxXMargin ];
  380.         
  381.         /* build the textfield */
  382.         s_rc.origin.x = s_rc.size.width - 200 - OFFSET_RIGHT;
  383.         s_rc.size.width = 200;
  384.         
  385.         o_textfield = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  386.         [o_textfield setAutoresizingMask:NSViewMinXMargin | NSViewWidthSizable ];
  387.         [o_textfield setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  388.         [o_textfield setStringValue: [NSApp localizedString: p_item->psz_value]];
  389.         [[self contentView] addSubview: o_textfield];
  390.     }
  391.     return self;
  392. }
  393. - (void)dealloc
  394. {
  395.     [o_textfield release];
  396.     [super dealloc];
  397. }
  398. - (char *)stringValue
  399. {
  400.     return strdup( [NSApp delocalizeString:[o_textfield stringValue]] );
  401. }
  402. @end
  403. @implementation StringListConfigControl
  404. - (id)initWithFrame: (NSRect)frame
  405.         item: (module_config_t *)p_item
  406.         withObject: (vlc_object_t *)_p_this
  407. {
  408.     frame.size.height = 20;
  409.     if( self = [super initWithFrame: frame item: p_item
  410.                 withObject: _p_this] )
  411.     {
  412.         NSRect s_rc = frame;
  413.         int i_index;
  414.         /* add the label */
  415.         o_label = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  416.         [o_label setDrawsBackground: NO];
  417.         [o_label setBordered: NO];
  418.         [o_label setEditable: NO];
  419.         [o_label setSelectable: NO];
  420.         if( p_item->psz_text )
  421.             [o_label setStringValue: [NSApp localizedString: p_item->psz_text]];
  422.         [o_label sizeToFit];
  423.         [[self contentView] addSubview: o_label];
  424.         [o_label setAutoresizingMask:NSViewMaxXMargin ];
  425.         
  426.         /* build the textfield */
  427.         s_rc.origin.x = s_rc.size.width - 200 - OFFSET_RIGHT;
  428.         s_rc.size.width = 200;
  429.         
  430.         o_combo = [[[NSComboBox alloc] initWithFrame: s_rc] retain];
  431.         [o_combo setAutoresizingMask:NSViewMinXMargin | NSViewWidthSizable ];
  432.         [o_combo setUsesDataSource:TRUE];
  433.         [o_combo setDataSource:self];
  434.         [o_combo setNumberOfVisibleItems:10];
  435.         for( i_index = 0; i_index < p_item->i_list; i_index++ )
  436.         {
  437.             if( p_item->psz_value && !strcmp( p_item->psz_value, p_item->ppsz_list[i_index] ) )
  438.             {
  439.                 [o_combo selectItemAtIndex: i_index];
  440.             }
  441.         }
  442.         [o_combo setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  443.         [[self contentView] addSubview: o_combo];
  444.     }
  445.     return self;
  446. }
  447. - (void)dealloc
  448. {
  449.     [o_combo release];
  450.     [super dealloc];
  451. }
  452. - (char *)stringValue
  453. {
  454.     module_config_t *p_item;
  455.     p_item = config_FindConfig( p_this, psz_name );
  456.     if( [o_combo indexOfSelectedItem] >= 0 )
  457.         return strdup( p_item->ppsz_list[[o_combo indexOfSelectedItem]] );
  458.     else
  459.         return strdup( [NSApp delocalizeString: [o_combo stringValue]] );
  460. }
  461. @end
  462. @implementation StringListConfigControl (NSComboBoxDataSource)
  463. - (int)numberOfItemsInComboBox:(NSComboBox *)aComboBox
  464. {
  465.     module_config_t *p_item;
  466.     p_item = config_FindConfig( p_this, psz_name );
  467.     return p_item->i_list;
  468. }
  469. - (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(int)i_index
  470. {
  471.     module_config_t *p_item;
  472.     p_item = config_FindConfig( p_this, psz_name );
  473.     if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
  474.     {
  475.         return [NSApp localizedString: p_item->ppsz_list_text[i_index]];
  476.     } else return [NSApp localizedString: p_item->ppsz_list[i_index]];
  477. }
  478. @end
  479. @implementation FileConfigControl
  480. - (id)initWithFrame: (NSRect)frame
  481.         item: (module_config_t *)p_item
  482.         withObject: (vlc_object_t *)_p_this
  483. {
  484.     frame.size.height = 49;
  485.     if( self = [super initWithFrame: frame item: p_item
  486.                 withObject: _p_this] )
  487.     {
  488.         NSRect s_rc = frame;
  489.         s_rc.origin.y = 29;
  490.         s_rc.size.height = 20;
  491.         /* is it a directory */
  492.         b_directory = ( [self getType] == CONFIG_ITEM_DIRECTORY ) ? YES : NO;
  493.         /* add the label */
  494.         o_label = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  495.         [o_label setDrawsBackground: NO];
  496.         [o_label setBordered: NO];
  497.         [o_label setEditable: NO];
  498.         [o_label setSelectable: NO];
  499.         if( p_item->psz_text )
  500.             [o_label setStringValue: [NSApp localizedString: p_item->psz_text]];
  501.         [o_label sizeToFit];
  502.         [o_label setAutoresizingMask:NSViewMaxXMargin ];
  503.         [[self contentView] addSubview: o_label];
  504.         
  505.         /* build the button */
  506.         s_rc.origin.y = s_rc.origin.x = 0;
  507.         s_rc.size.height = 22;
  508.         o_button = [[[NSButton alloc] initWithFrame: s_rc] retain];
  509.         [o_button setButtonType: NSMomentaryPushInButton];
  510.         [o_button setBezelStyle: NSRoundedBezelStyle];
  511.         [o_button setTitle: _NS("Browse...")];
  512.         [o_button sizeToFit];
  513.         [o_button setAutoresizingMask:NSViewMinXMargin];
  514.         [o_button setFrameOrigin: NSMakePoint( s_rc.size.width - 
  515.                     [o_button frame].size.width - OFFSET_RIGHT, s_rc.origin.y)];
  516.         [o_button setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  517.         [o_button setTarget: self];
  518.         [o_button setAction: @selector(openFileDialog:)];
  519.         s_rc.size.height = 22;
  520.         s_rc.size.width = s_rc.size.width - OFFSET_BETWEEN - [o_button frame].size.width - OFFSET_RIGHT;
  521.         
  522.         o_textfield = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  523.         
  524.         [o_textfield setStringValue: [NSApp localizedString: p_item->psz_value]];
  525.         [o_textfield setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  526.         [o_textfield setAutoresizingMask:NSViewWidthSizable];
  527.                
  528.         [[self contentView] addSubview: o_textfield];
  529.         [[self contentView] addSubview: o_button];
  530.     }
  531.     return self;
  532. }
  533. - (void)dealloc
  534. {
  535.     [o_textfield release];
  536.     [o_button release];
  537.     [super dealloc];
  538. }
  539. - (IBAction)openFileDialog: (id)sender
  540. {
  541.     NSOpenPanel *o_open_panel = [NSOpenPanel openPanel];
  542.     
  543.     [o_open_panel setTitle: _NS("Select a file or directory")];
  544.     [o_open_panel setPrompt: _NS("Select")];
  545.     [o_open_panel setAllowsMultipleSelection: NO];
  546.     [o_open_panel setCanChooseFiles: YES];
  547.     [o_open_panel setCanChooseDirectories: b_advanced];
  548.     [o_open_panel beginSheetForDirectory:nil
  549.         file:nil
  550.         types:nil
  551.         modalForWindow:[sender window]
  552.         modalDelegate: self
  553.         didEndSelector: @selector(pathChosenInPanel: 
  554.                         withReturn:
  555.                         contextInfo:)
  556.         contextInfo: nil];
  557. }
  558. - (void)pathChosenInPanel:(NSOpenPanel *)o_sheet withReturn:(int)i_return_code contextInfo:(void  *)o_context_info
  559. {
  560.     if( i_return_code == NSOKButton )
  561.     {
  562.         NSString *o_path = [[o_sheet filenames] objectAtIndex: 0];
  563.         [o_textfield setStringValue: o_path];
  564.     }
  565. }
  566. - (char *)stringValue
  567. {
  568.     return strdup( [[o_textfield stringValue] fileSystemRepresentation] );
  569. }
  570. @end
  571. @implementation IntegerConfigControl
  572. - (id)initWithFrame: (NSRect)frame
  573.         item: (module_config_t *)p_item
  574.         withObject: (vlc_object_t *)_p_this
  575. {
  576.     frame.size.height = 22;
  577.     if( self = [super initWithFrame: frame item: p_item
  578.                 withObject: _p_this] )
  579.     {
  580.         NSRect s_rc = frame;
  581.         /* add the label */
  582.         o_label = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  583.         [o_label setDrawsBackground: NO];
  584.         [o_label setBordered: NO];
  585.         [o_label setEditable: NO];
  586.         [o_label setSelectable: NO];
  587.         if( p_item->psz_text )
  588.             [o_label setStringValue: [NSApp localizedString: p_item->psz_text]];
  589.         [o_label sizeToFit];
  590.         [[self contentView] addSubview: o_label];
  591.         [o_label setAutoresizingMask:NSViewMaxXMargin ];
  592.         
  593.         /* build the stepper */
  594.         s_rc.origin.x = s_rc.size.width - 13 - OFFSET_RIGHT;
  595.         
  596.         o_stepper = [[[NSStepper alloc] initWithFrame: s_rc] retain];
  597.         [o_stepper sizeToFit];
  598.         [o_stepper setAutoresizingMask:NSViewMinXMargin];
  599.         [o_stepper setMaxValue: 1600];
  600.         [o_stepper setMinValue: -1600];
  601.         [o_stepper setIntValue: p_item->i_value];
  602.         [o_stepper setTarget: self];
  603.         [o_stepper setAction: @selector(stepperChanged:)];
  604.         [o_stepper sendActionOn:NSLeftMouseUpMask|NSLeftMouseDownMask|NSLeftMouseDraggedMask];
  605.         [o_stepper setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  606.         [[self contentView] addSubview: o_stepper];
  607.     
  608.         /* build the textfield */
  609.         s_rc.origin.x = s_rc.size.width - 60 - OFFSET_BETWEEN - 13 - OFFSET_RIGHT;
  610.         s_rc.size.width = 60;
  611.         
  612.         o_textfield = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  613.         [o_textfield setAutoresizingMask:NSViewMinXMargin | NSViewWidthSizable ];
  614.         [o_textfield setIntValue: p_item->i_value];
  615.         [o_textfield setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  616.         [o_textfield setDelegate: self];
  617.         [[NSNotificationCenter defaultCenter] addObserver: self
  618.             selector: @selector(textfieldChanged:)
  619.             name: NSControlTextDidChangeNotification
  620.             object: o_textfield];
  621.         [[self contentView] addSubview: o_textfield];
  622.     }
  623.     return self;
  624. }
  625. - (void)dealloc
  626. {
  627.     [o_stepper release];
  628.     [o_textfield release];
  629.     [super dealloc];
  630. }
  631. - (IBAction)stepperChanged:(id)sender
  632. {
  633.     [o_textfield setIntValue: [o_stepper intValue]];
  634. }
  635. - (void)textfieldChanged:(NSNotification *)o_notification
  636. {
  637.     [o_stepper setIntValue: [o_textfield intValue]];
  638. }
  639. - (int)getIntValue
  640. {
  641.     return [o_stepper intValue];
  642. }
  643. @end
  644. @implementation IntegerListConfigControl
  645. - (id)initWithFrame: (NSRect)frame
  646.         item: (module_config_t *)p_item
  647.         withObject: (vlc_object_t *)_p_this
  648. {
  649.     frame.size.height = 20;
  650.     if( self = [super initWithFrame: frame item: p_item
  651.                 withObject: _p_this] )
  652.     {
  653.         NSRect s_rc = frame;
  654.         int i_index;
  655.         /* add the label */
  656.         o_label = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  657.         [o_label setDrawsBackground: NO];
  658.         [o_label setBordered: NO];
  659.         [o_label setEditable: NO];
  660.         [o_label setSelectable: NO];
  661.         if( p_item->psz_text )
  662.             [o_label setStringValue: [NSApp localizedString: p_item->psz_text]];
  663.         [o_label sizeToFit];
  664.         [[self contentView] addSubview: o_label];
  665.         [o_label setAutoresizingMask:NSViewMaxXMargin ];
  666.         
  667.         /* build the textfield */
  668.         s_rc.origin.x = s_rc.size.width - 200 - OFFSET_RIGHT;
  669.         s_rc.size.width = 200;
  670.         
  671.         o_combo = [[[NSComboBox alloc] initWithFrame: s_rc] retain];
  672.         [o_combo setAutoresizingMask:NSViewMinXMargin | NSViewWidthSizable ];
  673.         [o_combo setUsesDataSource:TRUE];
  674.         [o_combo setDataSource:self];
  675.         [o_combo setNumberOfVisibleItems:10];
  676.         for( i_index = 0; i_index < p_item->i_list; i_index++ )
  677.         {
  678.             if( p_item->i_value == p_item->pi_list[i_index] )
  679.             {
  680.                 [o_combo selectItemAtIndex: i_index];
  681.             }
  682.         }
  683.         [o_combo setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  684.         [[self contentView] addSubview: o_combo];
  685.     }
  686.     return self;
  687. }
  688. - (void)dealloc
  689. {
  690.     [o_combo release];
  691.     [super dealloc];
  692. }
  693. - (int)intValue
  694. {
  695.     module_config_t *p_item;
  696.     p_item = config_FindConfig( p_this, psz_name );
  697.     if( [o_combo indexOfSelectedItem] >= 0 )
  698.         return p_item->pi_list[[o_combo indexOfSelectedItem]];
  699.     else
  700.         return [o_combo intValue];
  701. }
  702. @end
  703. @implementation IntegerListConfigControl (NSComboBoxDataSource)
  704. - (int)numberOfItemsInComboBox:(NSComboBox *)aComboBox
  705. {
  706.     module_config_t *p_item;
  707.     p_item = config_FindConfig( p_this, psz_name );
  708.     return p_item->i_list;
  709. }
  710. - (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(int)i_index
  711. {
  712.     module_config_t *p_item;
  713.     p_item = config_FindConfig( p_this, psz_name );
  714.     if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
  715.     {
  716.         return [NSApp localizedString: p_item->ppsz_list_text[i_index]];
  717.     } else return [NSString stringWithFormat: @"%i", p_item->pi_list[i_index]];
  718. }
  719. @end
  720. @implementation RangedIntegerConfigControl
  721. - (id)initWithFrame: (NSRect)frame
  722.         item: (module_config_t *)p_item
  723.         withObject: (vlc_object_t *)_p_this
  724. {
  725.     frame.size.height = 50;
  726.     if( self = [super initWithFrame: frame item: p_item
  727.                 withObject: _p_this] )
  728.     {
  729.         NSRect s_rc = frame;
  730.         s_rc.size.height = 20;
  731.         s_rc.origin.y = 30;
  732.     
  733.         /* add the label */
  734.         o_label = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  735.         [o_label setDrawsBackground: NO];
  736.         [o_label setBordered: NO];
  737.         [o_label setEditable: NO];
  738.         [o_label setSelectable: NO];
  739.         if( p_item->psz_text )
  740.             [o_label setStringValue: [NSApp localizedString: p_item->psz_text]];
  741.         [o_label sizeToFit];
  742.         [[self contentView] addSubview: o_label];
  743.         [o_label setAutoresizingMask:NSViewMaxXMargin ];
  744.         /* build the slider */
  745.         /* min value textfield */
  746.         s_rc.origin.y = 0;
  747.         s_rc.origin.x = 0;
  748.         s_rc.size.width = 40;
  749.         o_textfield_min = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  750.         [o_textfield_min setAutoresizingMask:NSViewMaxXMargin];
  751.         [o_textfield_min setDrawsBackground: NO];
  752.         [o_textfield_min setBordered: NO];
  753.         [o_textfield_min setEditable: NO];
  754.         [o_textfield_min setSelectable: NO];
  755.         [o_textfield_min setIntValue: p_item->i_min];
  756.         [o_textfield_min setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  757.         [[self contentView] addSubview: o_textfield_min];
  758.         /* the slider */
  759.         s_rc.size.width = [[self contentView] bounds].size.width - OFFSET_RIGHT - 2*OFFSET_BETWEEN - 3*40;
  760.         s_rc.origin.x = 40 + OFFSET_BETWEEN;
  761.         o_slider = [[[NSStepper alloc] initWithFrame: s_rc] retain];
  762.         [o_slider setAutoresizingMask:NSViewWidthSizable];
  763.         [o_slider setMaxValue: p_item->i_max];
  764.         [o_slider setMinValue: p_item->i_min];
  765.         [o_slider setIntValue: p_item->i_value];
  766.         [o_slider setTarget: self];
  767.         [o_slider setAction: @selector(sliderChanged:)];
  768.         [o_slider sendActionOn:NSLeftMouseUpMask|NSLeftMouseDownMask|NSLeftMouseDraggedMask];
  769.         [o_slider setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  770.         [[self contentView] addSubview: o_slider];
  771.         
  772.         /* max value textfield */
  773.         s_rc.size.width = 40;
  774.         s_rc.origin.x = [[self contentView] bounds].size.width - OFFSET_RIGHT - OFFSET_BETWEEN - 2*40;
  775.         
  776.         o_textfield_max = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  777.         [o_textfield_max setAutoresizingMask:NSViewMinXMargin ];
  778.         [o_textfield_max setDrawsBackground: NO];
  779.         [o_textfield_max setBordered: NO];
  780.         [o_textfield_max setEditable: NO];
  781.         [o_textfield_max setSelectable: NO];
  782.         [o_textfield_max setIntValue: p_item->i_max];
  783.         [o_textfield_max setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  784.         [[self contentView] addSubview: o_textfield_max];
  785.         
  786.         /* current value textfield */
  787.         s_rc.size.width = 40;
  788.         s_rc.origin.x = [[self contentView] bounds].size.width - OFFSET_RIGHT - 40;
  789.         o_textfield = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  790.         [o_textfield setAutoresizingMask:NSViewMinXMargin];
  791.         [o_textfield setIntValue: p_item->i_value];
  792.         [o_textfield setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  793.         [o_textfield setDelegate: self];
  794.         [[NSNotificationCenter defaultCenter] addObserver: self
  795.             selector: @selector(textfieldChanged:)
  796.             name: NSControlTextDidChangeNotification
  797.             object: o_textfield];
  798.         [[self contentView] addSubview: o_textfield];
  799.     }
  800.     return self;
  801. }
  802. - (void)dealloc
  803. {
  804.     [o_textfield release];
  805.     [o_textfield_min release];
  806.     [o_textfield_max release];
  807.     [o_slider release];
  808.     [super dealloc];
  809. }
  810. - (IBAction)sliderChanged:(id)sender
  811. {
  812.     [o_textfield setIntValue: [o_slider intValue]];
  813. }
  814. - (void)textfieldChanged:(NSNotification *)o_notification
  815. {
  816.     [o_slider setIntValue: [o_textfield intValue]];
  817. }
  818. - (int)intValue
  819. {
  820.     return [o_slider intValue];
  821. }
  822. @end
  823. @implementation FloatConfigControl
  824. - (id)initWithFrame: (NSRect)frame
  825.         item: (module_config_t *)p_item
  826.         withObject: (vlc_object_t *)_p_this
  827. {
  828.     frame.size.height = 20;
  829.     if( self = [super initWithFrame: frame item: p_item
  830.                 withObject: _p_this] )
  831.     {
  832.         NSRect s_rc = frame;
  833.         /* add the label */
  834.         o_label = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  835.         [o_label setDrawsBackground: NO];
  836.         [o_label setBordered: NO];
  837.         [o_label setEditable: NO];
  838.         [o_label setSelectable: NO];
  839.         if( p_item->psz_text )
  840.             [o_label setStringValue: [NSApp localizedString: p_item->psz_text]];
  841.         [o_label sizeToFit];
  842.         [[self contentView] addSubview: o_label];
  843.         [o_label setAutoresizingMask:NSViewMaxXMargin ];
  844.         /* build the textfield */
  845.         s_rc.origin.x = s_rc.size.width - 60 - OFFSET_RIGHT;
  846.         s_rc.size.width = 60;
  847.         
  848.         o_textfield = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  849.         [o_textfield setAutoresizingMask:NSViewMinXMargin | NSViewWidthSizable ];
  850.         [o_textfield setFloatValue: p_item->f_value];
  851.         [o_textfield setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  852.         [[self contentView] addSubview: o_textfield];
  853.     }
  854.     return self;
  855. }
  856. - (void)dealloc
  857. {
  858.     [o_textfield release];
  859.     [super dealloc];
  860. }
  861. - (float)floatValue
  862. {
  863.     return [o_textfield floatValue];
  864. }
  865. @end
  866. @implementation RangedFloatConfigControl
  867. - (id)initWithFrame: (NSRect)frame
  868.         item: (module_config_t *)p_item
  869.         withObject: (vlc_object_t *)_p_this
  870. {
  871.     frame.size.height = 50;
  872.     if( self = [super initWithFrame: frame item: p_item
  873.                 withObject: _p_this] )
  874.     {
  875.         NSRect s_rc = frame;
  876.         s_rc.size.height = 20;
  877.         s_rc.origin.y = 30;
  878.     
  879.         /* add the label */
  880.         o_label = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  881.         [o_label setDrawsBackground: NO];
  882.         [o_label setBordered: NO];
  883.         [o_label setEditable: NO];
  884.         [o_label setSelectable: NO];
  885.         if( p_item->psz_text )
  886.             [o_label setStringValue: [NSApp localizedString: p_item->psz_text]];
  887.         [o_label sizeToFit];
  888.         [[self contentView] addSubview: o_label];
  889.         [o_label setAutoresizingMask:NSViewMaxXMargin ];
  890.         /* build the slider */
  891.         /* min value textfield */
  892.         s_rc.origin.y = 0;
  893.         s_rc.origin.x = 0;
  894.         s_rc.size.width = 40;
  895.         o_textfield_min = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  896.         [o_textfield_min setAutoresizingMask:NSViewMaxXMargin];
  897.         [o_textfield_min setDrawsBackground: NO];
  898.         [o_textfield_min setBordered: NO];
  899.         [o_textfield_min setEditable: NO];
  900.         [o_textfield_min setSelectable: NO];
  901.         [o_textfield_min setFloatValue: p_item->f_min];
  902.         [o_textfield_min setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  903.         [[self contentView] addSubview: o_textfield_min];
  904.         /* the slider */
  905.         s_rc.size.width = [[self contentView] bounds].size.width - OFFSET_RIGHT - 2*OFFSET_BETWEEN - 3*40;
  906.         s_rc.origin.x = 40 + OFFSET_BETWEEN;
  907.         o_slider = [[[NSStepper alloc] initWithFrame: s_rc] retain];
  908.         [o_slider setAutoresizingMask:NSViewWidthSizable];
  909.         [o_slider setMaxValue: p_item->f_max];
  910.         [o_slider setMinValue: p_item->f_min];
  911.         [o_slider setFloatValue: p_item->f_value];
  912.         [o_slider setTarget: self];
  913.         [o_slider setAction: @selector(sliderChanged:)];
  914.         [o_slider sendActionOn:NSLeftMouseUpMask|NSLeftMouseDownMask|NSLeftMouseDraggedMask];
  915.         [o_slider setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  916.         [[self contentView] addSubview: o_slider];
  917.         
  918.         /* max value textfield */
  919.         s_rc.size.width = 40;
  920.         s_rc.origin.x = [[self contentView] bounds].size.width - OFFSET_RIGHT - OFFSET_BETWEEN - 2*40;
  921.         
  922.         o_textfield_max = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  923.         [o_textfield_max setAutoresizingMask:NSViewMinXMargin ];
  924.         [o_textfield_max setDrawsBackground: NO];
  925.         [o_textfield_max setBordered: NO];
  926.         [o_textfield_max setEditable: NO];
  927.         [o_textfield_max setSelectable: NO];
  928.         [o_textfield_max setFloatValue: p_item->f_max];
  929.         [o_textfield_max setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  930.         [[self contentView] addSubview: o_textfield_max];
  931.         
  932.         /* current value textfield */
  933.         s_rc.size.width = 40;
  934.         s_rc.origin.x = [[self contentView] bounds].size.width - OFFSET_RIGHT - 40;
  935.         o_textfield = [[[NSTextField alloc] initWithFrame: s_rc] retain];
  936.         [o_textfield setAutoresizingMask:NSViewMinXMargin];
  937.         [o_textfield setFloatValue: p_item->f_value];
  938.         [o_textfield setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  939.         [o_textfield setDelegate: self];
  940.         [[NSNotificationCenter defaultCenter] addObserver: self
  941.             selector: @selector(textfieldChanged:)
  942.             name: NSControlTextDidChangeNotification
  943.             object: o_textfield];
  944.         [[self contentView] addSubview: o_textfield];
  945.     }
  946.     return self;
  947. }
  948. - (void)dealloc
  949. {
  950.     [o_textfield release];
  951.     [o_textfield_min release];
  952.     [o_textfield_max release];
  953.     [o_slider release];
  954.     [super dealloc];
  955. }
  956. - (IBAction)sliderChanged:(id)sender
  957. {
  958.     [o_textfield setFloatValue: [o_slider floatValue]];
  959. }
  960. - (void)textfieldChanged:(NSNotification *)o_notification
  961. {
  962.     [o_slider setFloatValue: [o_textfield floatValue]];
  963. }
  964. - (float)floatValue
  965. {
  966.     return [o_slider floatValue];
  967. }
  968. @end
  969. @implementation BoolConfigControl
  970. - (id)initWithFrame: (NSRect)frame
  971.         item: (module_config_t *)p_item
  972.         withObject: (vlc_object_t *)_p_this
  973. {
  974.     frame.size.height = 20;
  975.     if( self = [super initWithFrame: frame item: p_item
  976.             withObject: _p_this] )
  977.     {
  978.         NSRect s_rc = frame;
  979.         s_rc.size.height = 20;
  980.         
  981.         o_checkbox = [[[NSButton alloc] initWithFrame: s_rc] retain];
  982.         [o_checkbox setButtonType: NSSwitchButton];
  983.         [o_checkbox setIntValue: p_item->i_value];
  984.         [o_checkbox setTitle: [NSApp localizedString: p_item->psz_text]];
  985.         [o_checkbox setToolTip: [NSApp wrapString: [NSApp localizedString: p_item->psz_longtext ] toWidth: PREFS_WRAP]];
  986.         [[self contentView] addSubview: o_checkbox];
  987.     }
  988.     return self;
  989. }
  990. - (void)dealloc
  991. {
  992.     [o_checkbox release];
  993.     [super dealloc];
  994. }
  995. - (int)intValue
  996. {
  997.     [o_checkbox intValue];
  998. }
  999. @end