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