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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * PreferencesWindow.cpp: beos interface
  3.  *****************************************************************************
  4.  * Copyright (C) 1999, 2000, 2001 the VideoLAN team
  5.  * $Id: 2370d91568ac021fcbc82395409192bd88f60261 $
  6.  *
  7.  * Authors: Eric Petit <titer@m0k.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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. #include <String.h>
  24. #ifdef HAVE_CONFIG_H
  25. # include "config.h"
  26. #endif
  27. #include <vlc_common.h>
  28. #include <vlc_interface.h>
  29. #include <vlc_keys.h>
  30. #include <vlc_config_cat.h>
  31. #include "PreferencesWindow.h"
  32. #define TYPE_CATEGORY 0
  33. #define TYPE_SUBCATEGORY 2
  34. #define TYPE_MODULE 3
  35. /*****************************************************************************
  36.  * PreferencesWindow::PreferencesWindow
  37.  *****************************************************************************/
  38. PreferencesWindow::PreferencesWindow( intf_thread_t * _p_intf,
  39.                                       BRect frame, const char * name )
  40.     : BWindow( frame, name, B_FLOATING_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
  41.                B_NOT_ZOOMABLE )
  42. {
  43.     p_intf   = _p_intf;
  44.     fCurrent = NULL;
  45.     BRect rect;
  46.     SetSizeLimits( PREFS_WINDOW_WIDTH, 2000, PREFS_WINDOW_HEIGHT, 2000 );
  47.     /* The "background" view */
  48.     fPrefsView = new BView( Bounds(), NULL, B_FOLLOW_ALL, B_WILL_DRAW );
  49.     fPrefsView->SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) );
  50.     AddChild( fPrefsView );
  51.     /* Create a scrollable outline view for the preferences tree */
  52.     rect = Bounds();
  53.     rect.InsetBy( 10, 10 );
  54.     rect.right = rect.left + 150;
  55.     fOutline = new BOutlineListView( rect, "preferences tree",
  56.                                      B_SINGLE_SELECTION_LIST,
  57.                                      B_FOLLOW_LEFT | B_FOLLOW_TOP_BOTTOM );
  58.     BScrollView * scrollview =
  59.         new BScrollView( "scrollview", fOutline,
  60.                          B_FOLLOW_LEFT | B_FOLLOW_TOP_BOTTOM,
  61.                          0, false, true );
  62.     fPrefsView->AddChild( scrollview );
  63.     /* We need to be informed if the user selects an item */
  64.     fOutline->SetSelectionMessage( new BMessage( PREFS_ITEM_SELECTED ) );
  65.     /* Create a dummy, empty view so we can correctly place the real
  66.        config views later */
  67.     rect.bottom -= 40;
  68.     rect.left = rect.right + 15 + B_V_SCROLL_BAR_WIDTH;
  69.     rect.right = Bounds().right - 15;
  70.     fDummyView = new BView( rect, "", B_FOLLOW_ALL_SIDES, B_WILL_DRAW );
  71.     fDummyView->SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) );
  72.     fPrefsView->AddChild( fDummyView );
  73.     /* Fill the tree */
  74.     vlc_list_t * p_list;
  75.     p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE );
  76.     if( !p_list )
  77.     {
  78.         msg_Warn( p_intf, "couldn't find any module !" );
  79.         return;
  80.     }
  81.     /* Find the main module */
  82.     module_t * p_module = NULL;
  83.     module_config_t * p_item = NULL;
  84.     for( int i = 0; i < p_list->i_count; i++ )
  85.     {
  86.         p_module = (module_t*) p_list->p_values[i].p_object;
  87.         if( !strcmp( p_module->psz_object_name, "main" ) &&
  88.             ( p_item = p_module->p_config ) )
  89.             break;
  90.         else
  91.             p_module = NULL;
  92.     }
  93.     ConfigItem * catItem = NULL, * subcatItem, * otherItem;
  94.     if( p_module )
  95.     {
  96.         /* We found the main module, build the category tree */
  97.         for( ; p_item->i_type != CONFIG_HINT_END; p_item++ )
  98.         {
  99.             switch( p_item->i_type )
  100.             {
  101.                 case CONFIG_CATEGORY:
  102.                     catItem = new ConfigItem( p_intf,
  103.                         config_CategoryNameGet( p_item->i_value ),
  104.                         false,
  105.                         p_item->i_value,
  106.                         TYPE_CATEGORY,
  107.                         config_CategoryHelpGet( p_item->i_value ) );
  108.                     fOutline->AddItem( catItem );
  109.                     break;
  110.                 case CONFIG_SUBCATEGORY:
  111.                     if( catItem )
  112.                     {
  113.                         subcatItem = new ConfigItem( p_intf,
  114.                             config_CategoryNameGet( p_item->i_value ),
  115.                             false,
  116.                             p_item->i_value,
  117.                             TYPE_SUBCATEGORY,
  118.                             config_CategoryHelpGet( p_item->i_value ) );
  119.                         fOutline->AddUnder( subcatItem, catItem );
  120.                     }
  121.                     else
  122.                     {
  123.                         msg_Warn( p_intf, "subcategory without a category" );
  124.                     }
  125.                     break;
  126.             }
  127.         }
  128.     }
  129.     /* Now parse all others modules */
  130.     int category, subcategory, options;
  131.     for( int i = 0; i < p_list->i_count; i++ )
  132.     {
  133.         category    = -1;
  134.         subcategory = -1;
  135.         options     = 0;
  136.         p_module = (module_t*) p_list->p_values[i].p_object;
  137.         if( !strcmp( p_module->psz_object_name, "main" ) )
  138.             continue;
  139.         if( p_module->b_submodule ||
  140.             !( p_item = p_module->p_config ) )
  141.             continue;
  142.         for( ; p_item->i_type != CONFIG_HINT_END; p_item++ )
  143.         {
  144.             switch( p_item->i_type )
  145.             {
  146.                 case CONFIG_CATEGORY:
  147.                     category = p_item->i_value;
  148.                     break;
  149.                 case CONFIG_SUBCATEGORY:
  150.                     subcategory = p_item->i_value;
  151.                     break;
  152.                 default:
  153.                     if( p_item->i_type & CONFIG_ITEM )
  154.                         options++;
  155.             }
  156.             if( options > 0 && category >= 0 && subcategory >= 0 )
  157.             {
  158.                 break;
  159.             }
  160.         }
  161.         if( options < 1 || category < 0 || subcategory < 0 )
  162.             continue;
  163.         catItem = NULL;
  164.         for( int j = 0; j < fOutline->CountItemsUnder( NULL, true ); j++ )
  165.         {
  166.             catItem = (ConfigItem*)
  167.                 fOutline->ItemUnderAt( NULL, true, j );
  168.             if( catItem->ObjectId() == category )
  169.                 break;
  170.             else
  171.                 catItem = NULL;
  172.         }
  173.         if( !catItem )
  174.             continue;
  175.         subcatItem = NULL;
  176.         for( int j = 0; j < fOutline->CountItemsUnder( catItem, true ); j++ )
  177.         {
  178.             subcatItem = (ConfigItem*)
  179.                 fOutline->ItemUnderAt( catItem, true, j );
  180.             if( subcatItem->ObjectId() == subcategory )
  181.                 break;
  182.             else
  183.                 subcatItem = NULL;
  184.         }
  185.         if( !subcatItem )
  186.             subcatItem = catItem;
  187.         otherItem = new ConfigItem( p_intf,
  188.             p_module->psz_shortname ?
  189.               p_module->psz_shortname : p_module->psz_object_name,
  190.             p_module->b_submodule,
  191.             p_module->b_submodule ?
  192.               ((module_t *)p_module->p_parent)->i_object_id :
  193.               p_module->i_object_id,
  194.             TYPE_MODULE,
  195.             NULL );
  196.         fOutline->AddUnder( otherItem, subcatItem );
  197.     }
  198.     vlc_list_release( p_list );
  199.     /* Collapse the whole tree */
  200.     for( int i = 0; i < fOutline->FullListCountItems(); i++ )
  201.     {
  202.         otherItem = (ConfigItem *) fOutline->FullListItemAt( i );
  203.         fOutline->Collapse( otherItem );
  204.     }
  205.     /* Set the correct values */
  206.     Apply( false );
  207.     /* Select the first item */
  208.     fOutline->Select( 0 );
  209.     /* Add the buttons */
  210.     BButton * button;
  211.     rect = Bounds();
  212.     rect.InsetBy( 10, 10 );
  213.     rect.left = rect.right - 80;
  214.     rect.top = rect.bottom - 25;
  215.     button = new BButton( rect, "", _("Apply"), new BMessage( PREFS_APPLY ),
  216.                           B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM );
  217.     button->MakeDefault( true );
  218.     fPrefsView->AddChild( button );
  219.     rect.OffsetBy( -90, 0 );
  220.     button = new BButton( rect, "", _("Save"), new BMessage( PREFS_SAVE ),
  221.                           B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM );
  222.     fPrefsView->AddChild( button );
  223.     rect.OffsetBy( -90, 0 );
  224.     button = new BButton( rect, "", _("Defaults"),
  225.                           new BMessage( PREFS_DEFAULTS ),
  226.                           B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM );
  227.     fPrefsView->AddChild( button );
  228.     Hide();
  229.     Show();
  230. }
  231. /*****************************************************************************
  232.  * PreferencesWindow::~PreferencesWindow
  233.  *****************************************************************************/
  234. PreferencesWindow::~PreferencesWindow()
  235. {
  236. }
  237. /*****************************************************************************
  238.  * PreferencesWindow::QuitRequested
  239.  *****************************************************************************/
  240. bool PreferencesWindow::QuitRequested()
  241. {
  242.     if( !IsHidden() )
  243.     {
  244.         Hide();
  245.     }
  246.     return false;
  247. }
  248. /*****************************************************************************
  249.  * PreferencesWindow::MessageReceived
  250.  *****************************************************************************/
  251. void PreferencesWindow::MessageReceived( BMessage * message )
  252. {
  253.     switch( message->what )
  254.     {
  255.         case PREFS_ITEM_SELECTED:
  256.             Update();
  257.             break;
  258.         case PREFS_DEFAULTS:
  259.             config_ResetAll( p_intf );
  260.             config_SaveConfigFile( p_intf, NULL );
  261.             Apply( false );
  262.             break;
  263.         case PREFS_APPLY:
  264.             Apply( true );
  265.             break;
  266.         case PREFS_SAVE:
  267.             Apply( true );
  268.             config_SaveConfigFile( p_intf, NULL );
  269.             break;
  270.         default:
  271.             BWindow::MessageReceived( message );
  272.     }
  273. }
  274. /*****************************************************************************
  275.  * PreferencesWindow::FrameResized
  276.  *****************************************************************************/
  277. void PreferencesWindow::FrameResized( float width, float height )
  278. {
  279.     BWindow::FrameResized( width, height );
  280.     fCurrent->UpdateScrollBar();
  281. }
  282. /*****************************************************************************
  283.  * PreferencesWindow::Update
  284.  *****************************************************************************/
  285. void PreferencesWindow::Update()
  286. {
  287.     /* Get the selected item, if any */
  288.     if( fOutline->CurrentSelection() < 0 )
  289.         return;
  290.     /* Detach the old box if any */
  291.     if( fCurrent )
  292.     {
  293.         fCurrent->ResetScroll();
  294.         fDummyView->RemoveChild( fCurrent->Box() );
  295.     }
  296.     /* Add the new one... */
  297.     fCurrent = (ConfigItem *)
  298.         fOutline->ItemAt( fOutline->CurrentSelection() );
  299.     fDummyView->AddChild( fCurrent->Box() );
  300.     /* ...then resize it (we must resize it after it's attached or the
  301.        children don't get adjusted) */
  302.     fCurrent->Box()->ResizeTo( fDummyView->Bounds().Width(),
  303.                                fDummyView->Bounds().Height() );
  304.     fCurrent->UpdateScrollBar();
  305. }
  306. /*****************************************************************************
  307.  * PreferencesWindow::Apply
  308.  * Apply changes if doIt is true, revert them otherwise
  309.  *****************************************************************************/
  310. void PreferencesWindow::Apply( bool doIt )
  311. {
  312.     ConfigItem * item;
  313.     for( int i = 0; i < fOutline->FullListCountItems(); i++ )
  314.     {
  315.         item = (ConfigItem*) fOutline->FullListItemAt( i );
  316.         item->Apply( doIt );
  317.     }
  318. }
  319. /*****************************************************************************
  320.  * PreferencesWindow::ReallyQuit
  321.  *****************************************************************************/
  322. void PreferencesWindow::ReallyQuit()
  323. {
  324.     Lock();
  325.     Hide();
  326.     Quit();
  327. }
  328. /***********************************************************************
  329.  * ConfigItem::ConfigItem
  330.  ***********************************************************************
  331.  *
  332.  **********************************************************************/
  333. ConfigItem::ConfigItem( intf_thread_t * _p_intf, char * name,
  334.                         bool subModule, int objectId,
  335.                         int type, char * help )
  336.     : BStringItem( name )
  337. {
  338.     p_intf     = _p_intf;
  339.     fSubModule = subModule;
  340.     fObjectId  = objectId;
  341.     fType      = type;
  342.     fHelp      = strdup( help );
  343.     BRect r;
  344.     r = BRect( 0, 0, 100, 100 );
  345.     fBox = new BBox( r, NULL, B_FOLLOW_ALL );
  346.     fBox->SetLabel( name );
  347.     fTextView = NULL;
  348.     fScroll   = NULL;
  349.     fView     = NULL;
  350.     if( fType == TYPE_CATEGORY )
  351.     {
  352.         /* Category: we just show the help text */
  353.         r = fBox->Bounds();
  354.         r.InsetBy( 10, 10 );
  355.         r.top += 5;
  356.         fTextView = new VTextView( r, NULL, B_FOLLOW_ALL, B_WILL_DRAW);
  357.         fTextView->SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) );
  358.         fTextView->MakeEditable( false );
  359.         fTextView->MakeSelectable( false );
  360.         fTextView->Insert( fHelp );
  361.         fBox->AddChild( fTextView );
  362.         return;
  363.     }
  364.     vlc_list_t * p_list = NULL;
  365.     module_t * p_module = NULL;
  366.     if( fType == TYPE_MODULE )
  367.     {
  368.         p_module = (module_t *) vlc_object_get( fObjectId );
  369.     }
  370.     else
  371.     {
  372.         if( !( p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE,
  373.                                        FIND_ANYWHERE ) ) )
  374.         {
  375.             return;
  376.         }
  377.         for( int i = 0; i < p_list->i_count; i++ )
  378.         {
  379.             p_module = (module_t*) p_list->p_values[i].p_object;
  380.             if( !strcmp( p_module->psz_object_name, "main" ) )
  381.                 break;
  382.             else
  383.                 p_module = NULL;
  384.         }
  385.     }
  386.     if( !p_module )
  387.         /* Shouldn't happen */
  388.         return;
  389.     module_config_t * p_item;
  390.     p_item = fSubModule ? ((module_t *)p_module->p_parent)->p_config :
  391.                p_module->p_config;
  392.     if( fType == TYPE_SUBCATEGORY )
  393.     {
  394.         for( ; p_item->i_type != CONFIG_HINT_END; p_item++ )
  395.         {
  396.             if( p_item->i_type == CONFIG_SUBCATEGORY &&
  397.                 p_item->i_value == fObjectId )
  398.             {
  399.                 break;
  400.             }
  401.         }
  402.     }
  403.     r = fBox->Bounds();
  404.     r = BRect( 10,20,fBox->Bounds().right-B_V_SCROLL_BAR_WIDTH-10,
  405.                fBox->Bounds().bottom-10 );
  406.     fView = new BView( r, NULL, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP,
  407.                        B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE );
  408.     fView->SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) );
  409.     r = fView->Bounds();
  410.     r.InsetBy( 10,10 );
  411.     ConfigWidget * widget;
  412.     for( ; p_item->i_type != CONFIG_HINT_END; p_item++ )
  413.     {
  414.         if( ( p_item->i_type == CONFIG_CATEGORY ||
  415.               p_item->i_type == CONFIG_SUBCATEGORY ) &&
  416.             fType == TYPE_SUBCATEGORY &&
  417.             p_item->i_value != fObjectId )
  418.         {
  419.             break;
  420.         }
  421.         widget = new ConfigWidget( p_intf, r, p_item );
  422.         if( !widget->InitCheck() )
  423.         {
  424.             delete widget;
  425.             continue;
  426.         }
  427.         fView->AddChild( widget );
  428.         r.top += widget->Bounds().Height();
  429.     }
  430.     if( fType == TYPE_MODULE )
  431.     {
  432.         vlc_object_release( p_module );
  433.     }
  434.     else
  435.     {
  436.         vlc_list_release( p_list );
  437.     }
  438.     /* Create a scroll view around our fView */
  439.     fScroll = new BScrollView( NULL, fView, B_FOLLOW_ALL, 0, false,
  440.                                true, B_FANCY_BORDER );
  441.     fScroll->SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) );
  442.     fBox->AddChild( fScroll );
  443.     /* Adjust fView's height to the size it actually needs (we do this
  444.        only now so the BScrollView fits the BBox) */
  445.     fView->ResizeTo( fView->Bounds().Width(), r.top + 10 );
  446. }
  447. /***********************************************************************
  448.  * ConfigItem::~ConfigItem
  449.  ***********************************************************************
  450.  *
  451.  **********************************************************************/
  452. ConfigItem::~ConfigItem()
  453. {
  454.     if( fHelp )
  455.     {
  456.         free( fHelp );
  457.     }
  458. }
  459. /*****************************************************************************
  460.  * ConfigItem::UpdateScrollBar
  461.  *****************************************************************************/
  462. void ConfigItem::UpdateScrollBar()
  463. {
  464.     /* We have to fix the scrollbar manually because it doesn't handle
  465.        correctly simple BViews */
  466.     if( !fScroll )
  467.     {
  468.         return;
  469.     }
  470.     /* Get the available BRect for display */
  471.     BRect display = fScroll->Bounds();
  472.     display.right -= B_V_SCROLL_BAR_WIDTH;
  473.     /* Fix the scrollbar */
  474.     BScrollBar * scrollBar;
  475.     BRect visible = display & fView->Bounds();
  476.     BRect total   = display | fView->Bounds();
  477.     scrollBar = fScroll->ScrollBar( B_VERTICAL );
  478.     long max = (long)( fView->Bounds().Height() - visible.Height() );
  479.     if( max < 0 ) max = 0;
  480.     scrollBar->SetRange( 0, max );
  481.     scrollBar->SetProportion( visible.Height() / total.Height() );
  482.     scrollBar->SetSteps( 10, 100 );
  483.     /* We have to force redraw to avoid visual bugs when resizing
  484.        (BeOS bug?) */
  485.     fScroll->Invalidate();
  486.     fView->Invalidate();
  487. }
  488. /*****************************************************************************
  489.  * ConfigItem::ResetScroll
  490.  *****************************************************************************/
  491. void ConfigItem::ResetScroll()
  492. {
  493.     if( !fScroll )
  494.     {
  495.         return;
  496.     }
  497.     fView->ScrollTo( 0, 0 );
  498. }
  499. /***********************************************************************
  500.  * ConfigItem::Apply
  501.  ***********************************************************************
  502.  *
  503.  **********************************************************************/
  504. void ConfigItem::Apply( bool doIt )
  505. {
  506.     if( !fScroll )
  507.     {
  508.         return;
  509.     }
  510.     /* Call ConfigWidget::Apply for every child of your fView */
  511.     ConfigWidget * widget;
  512.     for( int i = 0; i < fView->CountChildren(); i++ )
  513.     {
  514.         widget = (ConfigWidget*) fView->ChildAt( i );
  515.         widget->Apply( doIt );
  516.     }
  517. }
  518. /***********************************************************************
  519.  * ConfigWidget::ConfigWidget
  520.  ***********************************************************************
  521.  * Builds a view with the right controls for the given config variable.
  522.  *  rect: the BRect where we place ourselves. All we care is its width
  523.  *    and its top coordinate, since we adapt our height to take only
  524.  *    the place we need
  525.  **********************************************************************/
  526. ConfigWidget::ConfigWidget( intf_thread_t * _p_intf, BRect rect,
  527.                             module_config_t * p_item )
  528.     : BView( rect, NULL, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP,
  529.              B_WILL_DRAW )
  530. {
  531.     p_intf = _p_intf;
  532.     SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) );
  533.     BRect r;
  534.     BMenuItem * menuItem;
  535.     fInitOK = true;
  536.     fType = p_item->i_type;
  537.     fName = strdup( p_item->psz_name );
  538.     switch( fType )
  539.     {
  540.         case CONFIG_ITEM_MODULE:
  541.         case CONFIG_ITEM_MODULE_CAT:
  542.         case CONFIG_ITEM_MODULE_LIST_CAT:
  543.         case CONFIG_ITEM_STRING:
  544.         case CONFIG_ITEM_FILE:
  545.         case CONFIG_ITEM_DIRECTORY:
  546.         case CONFIG_ITEM_INTEGER:
  547.         case CONFIG_ITEM_FLOAT:
  548.             ResizeTo( Bounds().Width(), 25 );
  549.             fTextControl = new VTextControl( Bounds(), NULL,
  550.                 p_item->psz_text, NULL, new BMessage(),
  551.                 B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP );
  552.             AddChild( fTextControl );
  553.             break;
  554.         case CONFIG_ITEM_KEY:
  555.             ResizeTo( Bounds().Width(), 25 );
  556.             r = Bounds();
  557.             r.left = r.right - 100;
  558.             fPopUpMenu = new BPopUpMenu( "" );
  559.             fMenuField = new BMenuField( r, NULL, NULL, fPopUpMenu,
  560.                 B_FOLLOW_RIGHT | B_FOLLOW_TOP );
  561.             for( unsigned i = 0;
  562.                  i < sizeof( vlc_keys ) / sizeof( key_descriptor_t );
  563.                  i++ )
  564.             {
  565.                 menuItem = new BMenuItem( vlc_keys[i].psz_key_string, NULL );
  566.                 fPopUpMenu->AddItem( menuItem );
  567.             }
  568.             r.right = r.left - 10; r.left = r.left - 60;
  569.             fShiftCheck = new BCheckBox( r, NULL, "Shift",
  570.                 new BMessage(), B_FOLLOW_RIGHT | B_FOLLOW_TOP );
  571.             r.right = r.left - 10; r.left = r.left - 60;
  572.             fCtrlCheck = new BCheckBox( r, NULL, "Ctrl",
  573.                 new BMessage(), B_FOLLOW_RIGHT | B_FOLLOW_TOP );
  574.             r.right = r.left - 10; r.left = r.left - 60;
  575.             fAltCheck = new BCheckBox( r, NULL, "Alt",
  576.                 new BMessage(), B_FOLLOW_RIGHT | B_FOLLOW_TOP );
  577.             r.right = r.left - 10; r.left = 0; r.bottom -= 10;
  578.             fStringView = new BStringView( r, NULL, p_item->psz_text,
  579.                 B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP );
  580.             AddChild( fStringView );
  581.             AddChild( fAltCheck );
  582.             AddChild( fCtrlCheck );
  583.             AddChild( fShiftCheck );
  584.             AddChild( fMenuField );
  585.             break;
  586.         case CONFIG_ITEM_BOOL:
  587.             ResizeTo( Bounds().Width(), 25 );
  588.             fCheckBox = new BCheckBox( Bounds(), NULL, p_item->psz_text,
  589.                 new BMessage(), B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP );
  590.             AddChild( fCheckBox );
  591.             break;
  592.         case CONFIG_SECTION:
  593.             fInitOK = false;
  594.             break;
  595.         default:
  596.             fInitOK = false;
  597.     }
  598. }
  599. ConfigWidget::~ConfigWidget()
  600. {
  601.     free( fName );
  602. }
  603. /***********************************************************************
  604.  * ConfigWidget::Apply
  605.  ***********************************************************************
  606.  *
  607.  **********************************************************************/
  608. void ConfigWidget::Apply( bool doIt )
  609. {
  610.     BMenuItem * menuItem;
  611.     char string[256];
  612.     vlc_value_t val;
  613.     switch( fType )
  614.     {
  615.         case CONFIG_ITEM_STRING:
  616.         case CONFIG_ITEM_FILE:
  617.         case CONFIG_ITEM_MODULE:
  618.         case CONFIG_ITEM_MODULE_CAT:
  619.         case CONFIG_ITEM_MODULE_LIST_CAT:
  620.         case CONFIG_ITEM_DIRECTORY:
  621.             if( doIt )
  622.             {
  623.                 config_PutPsz( p_intf, fName, fTextControl->Text() );
  624.             }
  625.             else
  626.             {
  627.                 fTextControl->SetText( config_GetPsz( p_intf, fName ) );
  628.             }
  629.             break;
  630.         case CONFIG_ITEM_INTEGER:
  631.             if( doIt )
  632.             {
  633.                 config_PutInt( p_intf, fName, atoi( fTextControl->Text() ) );
  634.             }
  635.             else
  636.             {
  637.                 snprintf( string, 256, "%d", config_GetInt( p_intf, fName ) );
  638.                 fTextControl->SetText( string );
  639.             }
  640.             break;
  641.         case CONFIG_ITEM_FLOAT:
  642.             if( doIt )
  643.             {
  644.                 config_PutFloat( p_intf, fName, atof( fTextControl->Text() ) );
  645.             }
  646.             else
  647.             {
  648.                 snprintf( string, 256, "%f", config_GetFloat( p_intf, fName ) );
  649.                 fTextControl->SetText( string );
  650.             }
  651.             break;
  652.         case CONFIG_ITEM_KEY:
  653.             if( doIt )
  654.             {
  655.                 menuItem = fPopUpMenu->FindMarked();
  656.                 if( menuItem )
  657.                 {
  658.                     val.i_int = vlc_keys[fPopUpMenu->IndexOf( menuItem )].i_key_code;
  659.                     if( fAltCheck->Value() )
  660.                     {
  661.                         val.i_int |= KEY_MODIFIER_ALT;
  662.                     }
  663.                     if( fCtrlCheck->Value() )
  664.                     {
  665.                         val.i_int |= KEY_MODIFIER_CTRL;
  666.                     }
  667.                     if( fShiftCheck->Value() )
  668.                     {
  669.                         val.i_int |= KEY_MODIFIER_SHIFT;
  670.                     }
  671.                     var_Set( p_intf->p_libvlc, fName, val );
  672.                 }
  673.             }
  674.             else
  675.             {
  676.                 val.i_int = config_GetInt( p_intf, fName );
  677.                 fAltCheck->SetValue( val.i_int & KEY_MODIFIER_ALT );
  678.                 fCtrlCheck->SetValue( val.i_int & KEY_MODIFIER_CTRL );
  679.                 fShiftCheck->SetValue( val.i_int & KEY_MODIFIER_SHIFT );
  680.  
  681.                 for( unsigned i = 0;
  682.                      i < sizeof( vlc_keys ) / sizeof( key_descriptor_t ); i++ )
  683.                 {
  684.                     if( (unsigned) vlc_keys[i].i_key_code ==
  685.                             ( val.i_int & ~KEY_MODIFIER ) )
  686.                     {
  687.                         menuItem = fPopUpMenu->ItemAt( i );
  688.                         menuItem->SetMarked( true );
  689.                         break;
  690.                     }
  691.                 }
  692.             }
  693.             break;
  694.         case CONFIG_ITEM_BOOL:
  695.             if( doIt )
  696.             {
  697.                 config_PutInt( p_intf, fName, fCheckBox->Value() );
  698.             }
  699.             else
  700.             {
  701.                 fCheckBox->SetValue( config_GetInt( p_intf, fName ) );
  702.             }
  703.             break;
  704.         default:
  705.             break;
  706.     }
  707. }
  708. VTextView::VTextView( BRect frame, const char *name,
  709.                       uint32 resizingMode, uint32 flags )
  710.     : BTextView( frame, name, BRect( 10,10,10,10 ), resizingMode, flags )
  711. {
  712.     FrameResized( Bounds().Width(), Bounds().Height() );
  713. }
  714. void VTextView::FrameResized( float width, float height )
  715. {
  716.     BTextView::FrameResized( width, height );
  717.     SetTextRect( BRect( 10,10, width-11, height-11 ) );
  718. }
  719. VTextControl::VTextControl( BRect frame, const char *name,
  720.                             const char *label, const char *text,
  721.                             BMessage * message, uint32 resizingMode )
  722.     : BTextControl( frame, name, label, text, message, resizingMode )
  723. {
  724.     FrameResized( Bounds().Width(), Bounds().Height() );
  725. }
  726. void VTextControl::FrameResized( float width, float height )
  727. {
  728.     BTextControl::FrameResized( width, height );
  729.     SetDivider( width / 2 );
  730. }